ruby thread vs thread pool ..批准的解决方案vs速度

时间:2014-04-02 15:27:59

标签: ruby multithreading threadpool

我的代码需要并行运行多次。 当一个线程找到有效的解决方案时,我发现here一个唤醒主线程,加入子节点的代码:

valid_answer = nil
threads = []

1500.times do
  threads << Thread.new do 
    Thread.current[:output] = do_some_stuff
    valid_answer ||= Thread.current[:output] and Thread.main.wakeup if valid_answer != nil
  end
end

sleep
threads.each { |t| t.kill if t.alive? }
puts valid_answer

这个解决方案很好但很慢。 当我使用ThreadPool时,速度方面有明显的增益,但我找不到如何在第一个线程有效答案时停止池

require 'thread/pool'

pool = Thread.pool(1500)
1500.times {
  pool.process {
    sleep 2
    do_some_stuff

              }
}
pool.shutdown

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

一个解决方案是由do_some_stuff定期检查的全局标志。如果do_some_stuff看到标志设置,它应该清理(如果需要)并尽快返回。找到有效答案后立即设置标志。

线程应该合作。 要求一个线程做某事而不是强制它做某事,几乎总是更好。