gpt4 book ai didi

ruby-on-rails - 如何捕获线程中的错误,然后在所有线程完成后重新抛出该错误?

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:03 24 4
gpt4 key购买 nike

我正在使用 Rails 5。我有这个用于管理线程的 gem ...

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

我想知道,如果我的池中的一个线程抛出错误,我可以在所有线程完成后抛出异常,从而停止我的程序。如果没有线程抛出错误,那么我可以继续发生的任何事情。

在上面,您会注意到我故意引起了一个应该导致错误的条件,但我从来没有发现它,因为我猜线程池正在吞噬异常的输出。

最佳答案

回答你的问题 - 图书馆没有实际的方法explicitly silences exceptions并且没有针对它的配置。

一种可能的解决方法是手动捕获异常:

error = nil
pool = Concurrent::FixedThreadPool.new(1)
numbers.each do |number|
pool.post do
begin
some_dangerous_action(number)
rescue Exception => e
error = e
raise # still let the gem do its thing
end
end
end

pool.shutdown
pool.wait_for_termination

raise error if error

关于ruby-on-rails - 如何捕获线程中的错误,然后在所有线程完成后重新抛出该错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925124/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com