2011-09-29 29 views
1

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

是否有无论如何检查红宝石中的线程是否是“免费”的。目前我用过

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

但是好像不是正确的方法,有的线程仍然覆盖其他工作。

+1

可能的重复:http://stackoverflow.com/questions/6558828/thread-and-queue – steenslag

+0

@steenslag我没有看到任何东西类似的...在那个话题中,他们需要一个队列来存储作品。我不需要这个,我只想知道一个线程是否可以自由使用 – w00d

+0

也许可以测试'alive?',或者如果你想在同一时间想要拥有的多个线程上检查'Thread .list.size' – derp

回答

1

请参阅Deadlock in ThreadPool针对工作线程池实现的回答。

有了一个线程池,你可以做这样的事情:

pool = ThreadPool.new(10) # up to 10 threads 
email_addresses.each do |addr| 
    pool.process {send_mail_to addr} 
end 

线程池#程序将阻止如果没有可用线程来完成工作,继续当一个是免费的。

也有执行一个线程池,像宝石:http://rubygems.org/gems/work_queue

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如果所有成员都是假的(即所有线程都死了)