在我的
Ruby on Rails应用程序上,我需要并行执行50个后台作业.每个作业都创建到不同服务器的TCP连接,定义一些数据并更新活动记录对象.
我知道执行此任务的不同解决方案,但它们中的任何一个并行.例如,如果只有并行执行所有作业,delayed_job(DJ)可能是一个很好的解决方案.
有任何想法吗?谢谢.
解决方法
一些想法……
>仅仅因为你需要阅读50个站点并且自然想要一些并行工作并不意味着你需要50个进程或线程.您需要平衡减速和开销.如果有10个或20个进程每个读取几个站点怎么样?
>根据您使用的Ruby,请注意绿色线程,您可能无法获得所需的并行结果
>您可能希望将其构造为反向客户端inetd,并使用connect_nonblock和IO.select通过使所有服务器并行响应来获取所需的并行连接.您并不需要并行处理结果,只需要并行处理所有服务器,因为这是延迟的真正原因.
所以,来自套接字库的类似内容……将其扩展为多个未完成的连接……
require 'socket' include Socket::Constants socket = Socket.new(AF_INET,SOCK_STREAM,0) sockaddr = Socket.sockaddr_in(80,'www.google.com') begin socket.connect_nonblock(sockaddr) rescue Errno::EINPROGRESS IO.select(nil,[socket]) begin socket.connect_nonblock(sockaddr) rescue Errno::EISCONN end end socket.write("GET / HTTP/1.0\r\n\r\n") # here perhaps insert IO.select. You may not need multiple threads OR multiple # processes with this technique,but if you do insert them here results = socket.read