我想拥有一个线程数组[],这样如果一个线程“空闲”或者没有在任何程序上工作,那么它将被分配一个新任务。
无论如何都要检查ruby中的线程是否“免费”。目前我用过
if (threads[thread_id].nil? || !threads[thread_id].status)
# yes thread is free
但似乎没有正确的方法,一些线程仍然覆盖其他工作。
答案 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