确保很多线程在Ruby中完成的最简单方法?

时间:2014-10-08 22:57:38

标签: ruby multithreading

我创造了很多线程:

(1..255).each do |n|
  Thread.new do
    sleep(10) # does a lot of work
  end
end
# at this point I need to make sure all the threads completed

我希望我可以将每个帖子添加到ThreadGroup并在wait_until_all_threads_complete上调用ThreadGroup之类的函数。但是我在Ruby文档中看不到任何明显的东西。

我是否必须将每个线程添加到一个数组中,然后遍历每个调用thread.join的线程?对于这种极其常见的用例,必须有一种更简单的方法。

threads = (1..255).map do |n|
  Thread.new do
    sleep(10) # does a lot of work
  end
end
threads.each do |thread|
  thread.join
end

1 个答案:

答案 0 :(得分:1)

使用ThreadGroup#list

如果将线程分配给具有ThreadGroup#add的ThreadGroup,则可以将Thread#join或其他Thread方法映射到ThreadGroup#list方法返回的组的每个成员。例如:

thread_group = ThreadGroup.new
255.times do
  thread_group.add Thread.new { sleep 10 }
end
thread_group.list.map &:join

这只会加入属于 thread_group 的线程,而不是ThreadGroup :: Default。