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