一次处理n个项目(使用线程)

时间:2009-11-03 00:17:51

标签: ruby multithreading limit

我正在做很多人可能需要做的事情,处理具有可变执行时间的任务。我有以下概念证明代码:

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

在前一个线程之一掉线之前,它不会启动新线程。有谁知道更好,更优雅的方式吗?

2 个答案:

答案 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