我有几个线程正在运行,并希望等待它们完成:
[thread_a, thread_b].each(&:join)
假设其中一个线程一旦启动就会立即遭遇致命异常。同时,另一个需要10分钟才能完成。如果我们很幸运并且thread_a
是失败的主题,我们会立即得到它的例外,因为它首先被加入。但是,如果我们不走运,我们必须等待10分钟才能完成thread_a
,然后只有thread_b
才能将其异常提升到父线程。
我有一个现有的解决方案,在每个线程中使用ensure
块,以便在退出时将该线程插入队列。然后,父线程可以轮询队列并在完成时加入每个线程。但是,我想知道Ruby是否有更惯用的方法来处理这个问题?
现有解决方案:
dead_threads = Queue.new
threads = 2.times.map do |i|
Thread.new do
begin
case i
when 0; sleep
when 1; raise "I'm the problem thread!"
end
ensure
dead_threads << Thread.current
end
end
end
live_threads_count = threads.size
until live_threads_count == 0
dead_threads.shift.join
live_threads_count -= 1
end