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として検出されて意味わからんでしたよ。せめてエラー内容を標準エラー出力に吐いてくれんかなあ。。。