按照完成的顺序连接线程,以便更快地引发异常

时间:2017-11-20 22:46:50

标签: ruby multithreading deadlock

我有几个线程正在运行,并希望等待它们完成:

[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

0 个答案:

没有答案