我正在使用 Rails 5。我有这个用于管理线程的宝石......
gem 'concurrent-ruby'
我注意到如果我的一个线程抛出一个错误,它就会被吞掉,我永远不会发现它。我在控制台中试过这个
pool = Concurrent::FixedThreadPool.new(1)
# => #<Concurrent::FixedThreadPool:0x007fe3585ab368 @__lock__=#<Thread::Mutex:0x007fe3585ab0c0>, @__condition__=#<Thread::ConditionVariable:0x007fe3585ab098>, @min_length=1, @max_length=1, @idletime=60, @max_queue=0, @fallback_policy=:abort, @auto_terminate=true, @pool=[], @ready=[], @queue=[], @scheduled_task_count=0, @completed_task_count=0, @largest_length=0, @ruby_pid=23932, @gc_interval=30, @next_gc_time=252232.13299, @StopEvent=#<Concurrent::Event:0x007fe3585aaf30 @__lock__=#<Thread::Mutex:0x007fe3585aaeb8>, @__condition__=#<Thread::ConditionVariable:0x007fe3585aae90>, @set=false, @iteration=0>, @StoppedEvent=#<Concurrent::Event:0x007fe3585aadc8 @__lock__=#<Thread::Mutex:0x007fe3585aad78>, @__condition__=#<Thread::ConditionVariable:0x007fe3585aad50>, @set=false, @iteration=0>>
nums.each do |num|
pool.post do
if num == 1
asdfasdf
end
end
end
# => [1, 2, 3]
pool.shutdown # => true
pool.wait_for_termination # => true
我想知道,如果我的池中的一个线程抛出错误,我可以在所有线程都完成后抛出异常,从而停止我的程序。如果没有任何线程抛出错误,那么我可以继续处理正在发生的事情。
在上面,你会注意到我故意导致了一个应该导致错误的条件,但我从来没有发现它,因为我猜线程池正在吞噬异常的输出。