[英]unexpected behaviour of ruby threading code snippet
我正在尝试在ruby中学习线程,我正在执行以下代码:
Thread.abort_on_exception = true
threads = 5.times.map do |i|
Thread.new(i) do |j|
raise "Boom!" if j == 1
print "#{j}\n"
end
end
i=0
loop do
i+=1
puts "Waiting!!" if i == 10000
break if i == 10**4
end
threads.each do |th|
begin
th.join
rescue RuntimeError => e
puts e
end
end
puts "Done!!"
有时,它毫无例外地完美运行,并显示如下输出:
Waiting!!
0
2
3
4
Boom!
Boom!
Done!!
有时它会异常退出并显示如下输出:
0
2
3
4
threading.rb:5:in `block (2 levels) in <main>': Boom! (RuntimeError)
现在我的问题是:
开发环境:
在主线程通过Thread#join
调用到达块之前,该线程中发生了异常。 特别是在循环中 问题是,除了冒泡到主线程之外,它实际上可以在任何代码行中发生; 因此,您还需要将错误处理封装在线程中。 也许它可以返回一个错误值,但是使用此并发模型时,从根本上打破了异常。
(要向自己证明这一点,请尝试在文件顶部设置$DEBUG = true
;这将向您显示异常真正发生的位置。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.