rubyのスレッドで文法ミスで落ちたときに気づかない問題
Thread.abort_on_exception = trueとしたほうがデバッグ時にはよいことがある。
anemoneの拡張をしているとき、書いたスクリプトに文法上の問題があったとしてもそこでスレッドが黙ってお亡くなりになり、Queueに仕事を入れる人がいなくなってdeadlockしてしまった。
deadlockとか言われても、この人がqueueに仕事を入れるからおまえはそれまで待っておればいいんだ!なんて思っていたが、待ってるスレッドが一つ少ないことで気がついた。
サンプルコード
require 'thread' queue = Queue.new Thread.abort_on_exception = false ## ここを変化させる。デフォルトはfalse Thread.new do loop do aaa # ERROR!!!!! queue.enq "running" end end Thread.new do loop do puts queue.deq end end.join
Thread.abort_on_exception = falseの場合の実行結果
deadlock 0x7fed3a94: sleep:- - thread.rb:14 deadlock 0x1004c47c: sleep:J(0x7fed3a94) (main) - thread.rb:12 thread.rb:12:in `join': Thread(0x1004c47c): deadlock (fatal) from thread.rb:12
Thread.abort_on_exception = trueの場合の実行結果
thread.rb:8: undefined local variable or method `aaa' for main:Object (NameError) from thread.rb:7:in `loop' from thread.rb:7 from thread.rb:6:in `initialize' from thread.rb:6:in `new' from thread.rb:6
false(デフォルト)のままでテストをやっていたので、こういうコーディングミスがdeadlockとして検出されて意味わからんでしたよ。せめてエラー内容を標準エラー出力に吐いてくれんかなあ。。。