ruby - 我如何管理 ruby​​ 线程以便它们完成所有工作?

标签 ruby multithreading threadpool

我有一个可以划分为独立单元的计算,我现在处理它的方式是创建固定数量的线程,然后将工作 block 交给每个线程来完成。所以在伪代码中它是这样的

# 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?

最佳答案

在 ruby​​ 1.9(和 2.0)中,您可以使用标准库中的 ThreadsWait 来达到此目的:

require 'thread'
require 'thwait'

threads = []
threads << Thread.new { }
threads << Thread.new { }
ThreadsWait.all_waits(*threads)

关于ruby - 我如何管理 ruby​​ 线程以便它们完成所有工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241384/

相关文章:

ruby - 什么不能从 ruby​​ 中的对象访问类变量?

ruby-on-rails - 如何使用 Rspec 重构 Rails 模型中的复杂方法?

java - 下面的代码运行成功,那么是否意味着我们可以启动线程两次?

multithreading - 了解 Rust channel 。 `send` 如何工作?

java - 当 corePoolSize = 0 时,ScheduledExecutorService 消耗 100% CPU

ruby-on-rails - Rails 3 : belongs_to, has_one 和迁移

html - 多个选择框在 Rails 中不起作用

java - 在Java中,将线程的ID暴露给任意线程是否是一个安全问题?

java - 在多用户 JSP J2EE 应用程序中创建和关闭 ExecutorService 实例

multithreading - 当监听器线程终止时,如何在不重新启动服务器的情况下获得与服务器丢失的连接