产生多个并行任务

时间:2012-03-13 00:24:29

标签: ruby ruby-on-rails-3 parallel-processing

我有M个要处理的任务和N个可用的并行处理资源(想想Heroko或EC2实例上的工作线程),其中M>> Ñ

我可以推出自己的系统,但似乎已经有一个已调试的软件包或宝石:你推荐什么? (现在我考虑一下,我可以折磨Delayed :: Job来做这件事。)

任务可以用任何语言编写 - 即使是shell脚本也可以完成任务。 “母船”是带有PostgreSQL数据库的Ruby On Rails。基本思想是,当资源准备好处理任务时,它会向母船请求队列中的下一个未处理任务并开始处理它。如果作业失败,则在放弃之前重新尝试几次。结果可以进入平面文件或写入PostgreSQL数据库。

(而且,不,这不是用于生成垃圾邮件。我正在研究几个大型社交网络的degree distribution。)

3 个答案:

答案 0 :(得分:2)

这将是您自己的,但如果您的并行任务不是资源密集型,那么它是一个相当快速的解决方案。另一方面,如果它们是资源密集型的,那么您希望实现更强大的功能。

您可以使用Process::fork(如果流程是ruby),或Process::execProcess::spawn(如果流程是其他内容)启动每个帖子。然后使用Process::waitall完成子流程。

下面,我使用Hash来保存函数本身以及PID。这绝对可以改善。

# define the sub-processes
sleep_2_fail = lambda { sleep 2; exit -1; }
sleep_2_pass = lambda { sleep 2; exit 0; }
sleep_1_pass = lambda { sleep 1; exit 0; }
sleep_3_fail = lambda { sleep 3; exit -1; }

# use a hash to store the lambda's and their PID's
sub_processes = Hash.new

# add the sub_processes to the hash
#  key = PID
#  value = lambda (can use to be re-called later on)
sub_processes.merge! ({ Process::fork { sleep_2_fail.call } => sleep_2_fail })
sub_processes.merge! ({ Process::fork { sleep_2_pass.call } => sleep_2_pass })
sub_processes.merge! ({ Process::fork { sleep_1_pass.call } => sleep_1_pass })
sub_processes.merge! ({ Process::fork { sleep_3_fail.call } => sleep_3_fail })

# starting time of the loop
start = Time.now

# use a while loop to wait at most 10 seconds or until
# the results are empty (no sub-processes)
while ((results = Process.waitall).count > 0 && Time.now - start < 10) do
  results.each do |pid, status|
    if status != 0
       # again add the { PID => lambda } to the hash
       sub_processes.merge! ( { Process::fork { sub_processes[pid].call } => sub_processes[pid] } )
    end
    # delete the original entry
    sub_processes.delete pid
  end
end

waitall上的ruby-doc非常有用。

答案 1 :(得分:2)

我认为这是一个delayed_job https://github.com/collectiveidea/delayed_job或resque https://github.com/defunkt/resque工作,正如你所说。

答案 2 :(得分:1)

听起来你想要一个工作处理器。看看Gearman http://gearman.org/ 相当语言不可知。

这是红宝石宝石信息http://gearmanhq.com/help/tutorials/ruby/getting_started/