繁体   English   中英

红宝石线程代码片段的意外行为

[英]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)

现在我的问题是:

  1. 为什么? 我已经营救了它,它与RuntimeError一起退出。
  2. 怎么会有两个轰! 在输出中。

开发环境:

  • Windows 7(x64)
  • Ruby 2.1.5

在主线程通过Thread#join调用到达块之前,该线程中发生了异常。 特别是在循环中 问题是,除了冒泡到主线程之外,它实际上可以在任何代码行中发生; 因此,您还需要将错误处理封装在线程中。 也许它可以返回一个错误值,但是使用此并发模型时,从根本上打破了异常。

(要向自己证明这一点,请尝试在文件顶部设置$DEBUG = true ;这将向您显示异常真正发生的位置。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM