我正在做很多人可能需要做的事情,处理具有可变执行时间的任务。我有以下概念证明代码:
threads = []
(1...10000).each do |n|
threads << Thread.new do
run_for = rand(10)
puts "Starting thread #{n}(#{run_for})"
time=Time.new
while 1 do
if Time.new - time >= run_for then
break
else
sleep 1
end
end
puts "Ending thread #{n}(#{run_for})"
end
finished_threads = []
while threads.size >= 10 do
threads.each do |t|
finished_threads << t unless t.alive?
end
finished_threads.each do |t|
threads.delete(t)
end
end
end
在前一个线程之一掉线之前,它不会启动新线程。有谁知道更好,更优雅的方式吗?
答案 0 :(得分:2)
我建议创建一个工作池。见http://snippets.dzone.com/posts/show/3276。然后将所有可变长度的工作提交到池中,并调用 join 以等待所有线程完成。
答案 1 :(得分:0)
work_queue gem是在应用程序中异步和并发执行任务的最简单方法。
wq = WorkQueue.new 2 # Limit the maximum number of simultaneous worker threads
(1..10_000).each do
wq.enqueue_b do
# Task
end
end
wq.join # All tasks are complete after this