Tag:

如何管理ruby线程以便完成所有工作?

我有一个可以分成独立单元的计算,我现在处理它的方式是创建一个固定数量的线程,然后在每个线程中分发要完成的工作块。 所以在伪代码中这就是它的样子 # main thread work_units.take(10).each {|work_unit| spawn_thread_for work_unit} def spawn_thread_for(work) Thread.new do do_some work more_work = work_units.pop spawn_thread_for more_work unless more_work.nil? end end 基本上,一旦创建了初始线程数,每个线程都会完成一些工作,然后继续从工作堆中完成工作,直到没有剩下任何东西。 当我在irb中运行时,一切正常,但是当我使用解释器执行脚本时,事情并没有那么好用。 我不确定如何使主线程等到所有工作完成。 有没有一种很好的方法可以做到这一点,或者我一直坚持执行sleep 10 until work_units.empty? 在主线程中

ThreadPool中的死锁

我找不到适合Ruby的ThreadPool实现,所以我写了我的(部分基于这里的代码: http : //web.archive.org/web/20081204101031/http : //snippets.dzone.com : 80/ posts / show / 3276 ,但更改为等待/信号和ThreadPool关闭的其他实现。但是经过一段时间的运行(有100个线程并处理大约1300个任务),它在第25行死机 – 它等待一个新的工作那里。任何想法,为什么会发生? require ‘thread’ begin require ‘fastthread’ rescue LoadError $stderr.puts “Using the ruby-core thread implementation” end class ThreadPool class Worker def initialize(callback) @mutex = Mutex.new @cv = ConditionVariable.new @callback = callback @mutex.synchronize {@running = true} @thread = Thread.new do while @mutex.synchronize […]