我有M个要处理的任务和N个可用的并行处理资源(想想Heroko或EC2实例上的工作线程),其中M>> Ñ
我可以推出自己的系统,但似乎已经有一个已调试的软件包或宝石:你推荐什么? (现在我考虑一下,我可以折磨Delayed :: Job来做这件事。)
任务可以用任何语言编写 - 即使是shell脚本也可以完成任务。 “母船”是带有PostgreSQL数据库的Ruby On Rails。基本思想是,当资源准备好处理任务时,它会向母船请求队列中的下一个未处理任务并开始处理它。如果作业失败,则在放弃之前重新尝试几次。结果可以进入平面文件或写入PostgreSQL数据库。
(而且,不,这不是用于生成垃圾邮件。我正在研究几个大型社交网络的degree distribution。)
答案 0 :(得分:2)
这将是您自己的,但如果您的并行任务不是资源密集型,那么它是一个相当快速的解决方案。另一方面,如果它们是资源密集型的,那么您希望实现更强大的功能。
您可以使用Process::fork
(如果流程是ruby),或Process::exec
或Process::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/