Ruby检查线程是否“免费”

时间:2011-09-29 10:27:39

标签: ruby multithreading

我想拥有一个线程数组[],这样如果一个线程“空闲”或者没有在任何程序上工作,那么它将被分配一个新任务。

无论如何都要检查ruby中的线程是否“免费”。目前我用过

if (threads[thread_id].nil? || !threads[thread_id].status)
    # yes thread is free

但似乎没有正确的方法,一些线程仍然覆盖其他工作。

2 个答案:

答案 0 :(得分:1)

请参阅Deadlock in ThreadPool的答案,了解正在运行的线程池实现。

使用线程池,您可以执行以下操作:

pool = ThreadPool.new(10) # up to 10 threads
email_addresses.each do |addr|
  pool.process {send_mail_to addr}
end
如果没有空闲线程来完成工作,

ThreadPool #process将被阻止,并且当一个空闲时自动继续。

还有一些实现线程池的gem,例如:http://rubygems.org/gems/work_queue

答案 1 :(得分:1)

threads.each.map {|t| t.alive?}.none?
如果所有线程都已死,

返回true

如果您有这样的事情:

threads << Thread.new do
 # do dome work ...
end

并且您想要检查所有线程是否都处于活动状态(即死机),您可以随时使用它:

threads.each.map {|t| t.alive?}.none?

我们从数组中逐个获取一个线程并检查它是否还活着。 map方法创建具有true / false值的数组(alive / dead)。最后没有?如果所有成员都为假(即所有线程都已死),则enumerable方法应返回true