加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 使用Rails运行多个后台并行作业

发布时间:2020-12-16 19:02:18 所属栏目:百科 来源:网络整理
导读:在我的 Ruby on Rails应用程序上,我需要并行执行50个后台作业.每个作业都创建到不同服务器的TCP连接,定义一些数据并更新活动记录对象. 我知道执行此任务的不同解决方案,但它们中的任何一个并行.例如,如果只有并行执行所有作业,delayed_job(DJ)可能是一个很好
在我的 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.0rnrn")
# 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读