簡體   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