我的代码在这里......
require 'thread'
$temp = Thread.new do
loop do
puts 'loop me'
begin
puts "try thread"
raise Exception.new('QwQ') if rand > 0.5
puts "skip try"
rescue
puts "QwQ"
end
sleep(0.5)
end
puts '...WTF'
end
loop do
puts "runner #{Thread.list.length} #{$temp.status}"
sleep(2)
end
如何让runner
和loop thread
继续投放?以及如何像这段代码一样修复它?
我试过像Thread.abort_on_exception
,但它会杀死进程......
答案 0 :(得分:0)
在线程内部捕获异常,并将错误设置在主线程可访问的变量中(对于测试,您可以使用如下的全局变量:$ thread_error)。
如果存在错误变量,则从主线程中提起它。
您还可以使用队列在线程之间进行通信,但之后它将无法使用多个线程。
require 'thread'
$temp = Thread.new do
begin
loop do
puts 'loop me'
begin
puts "try thread"
raise Exception.new('QwQ') if rand > 0.5
puts "skip try"
rescue
puts "QwQ"
end
sleep(0.5)
end
puts '...WTF'
rescue Exception => e
$thread_error = e
raise e
end
end
loop do
puts "runner #{Thread.list.length} #{$temp.status}"
raise $thread_error if $thread_error
sleep(2)
end