我的代码需要并行运行多次。 当一个线程找到有效的解决方案时,我发现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
有什么建议吗?
答案 0 :(得分:0)
一个解决方案是由do_some_stuff定期检查的全局标志。如果do_some_stuff看到标志设置,它应该清理(如果需要)并尽快返回。找到有效答案后立即设置标志。
线程应该合作。 要求一个线程做某事而不是强制它做某事,几乎总是更好。