【发布时间】:2023-03-08 12:10:01
【问题描述】:
我有一个可以划分为独立单元的计算,我现在处理它的方式是创建固定数量的线程,然后交出要在每个线程中完成的工作块。所以在伪代码中是这样的
# 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?
【问题讨论】:
-
take(10)不是意味着只会处理前 10 个work_units吗? -
@Andrew Grimm:实际上没有,但是重读这个问题,看起来
work_units将超出spawn_thread_for的范围more_work = work_units.pop行 -
在实际代码中,它是一个实例变量,因此不存在范围问题。
-
注意:depending on which ruby implementation you use,线程可能不会真正并行工作(例如,使用多个 CPU 内核/通过拆分多个线程来更快地完成工作)。
标签: ruby multithreading threadpool