原です。
レポートの続きです。次のコードを動かすと、
-----^ test.rb
#!/usr/local/bin/ruby
class TimeoutError < Exception
end
def timeout(sec, msg = "timeout!!!")
begin
x = Thread.current
y = Thread.start {
sleep sec
x.raise TimeoutError, msg if x.status
}
yield
ensure
Thread.kill y if y.status
end
end
def re_try(times, error)
i = 1
begin
yield(i)
rescue error
if i < times
i += 1
retry
end
end
end
for k in 1..10
Thread.start {
re_try(30, TimeoutError) { |i|
print i, "\n"
timeout(2) { sleep 3 }
}
}
end
sleep 61
-----$ test.rb
数秒(不定)の後に
./test.rb:13:in `timeout': undefined method `status' for nil
from ./test.rb:33
from ./test.rb:34:in `re_try'
from ./test.rb:31
from ./test.rb:35:in `start'
from ./test.rb:30
from ./test.rb:36:in `each'
from ./test.rb:36
というのが出ます。再現性あり。
あと、これはちょっと怪しいんですが一度、起動後数秒して
TimeoutError が起こりました。こっちは再現しません。ただ
し、他のスクリプトでは度々起こっている様に見えます。悩
ませているのはこっちの方なんですが、もう少し調査します。