[ruby-dev:49184] [Ruby trunk - Bug #11344] Thread.handle_interrupt(TimeoutError => :never) が効かない
From:
tommy@...
Date:
2015-07-11 23:28:18 UTC
List:
ruby-dev #49184
Issue #11344 has been updated by Masahiro Tomita.
少なくとも Thread.handle_interrupt では Timeout::Error の指定は効かなかったので、しかたなく内部クラスの Timeout::ExitException を使ってたというライブラリもあるかもしれないので、
> 互換性を考えると ExitException = Timeout::Error とかしておいたほうがいいかなと思いますがどうでしょうか
に賛成です。
Mysql2 がそんな感じに使っちゃってます。 <https://github.com/brianmario/mysql2/blob/master/lib/mysql2/client.rb#L79>
まだこの変更はリリース前ですけど。
----------------------------------------
Bug #11344: Thread.handle_interrupt(TimeoutError => :never) が効かない
https://bugs.ruby-lang.org/issues/11344#change-53377
* Author: Masahiro Tomita
* Status: Closed
* Priority: Normal
* Assignee:
* ruby -v: ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
* Backport: 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED
----------------------------------------
るりま <http://docs.ruby-lang.org/ja/2.2.0/method/Thread/s/handle_interrupt.html> によると、`Thread.handle_interrupt(TimeoutError => :never)` で `TimeoutError` を制御できると書かれていますが、働きません。
~~~ruby
require 'timeout'
Thread.handle_interrupt(TimeoutError => :never) do
timeout(1) do
sleep 2
p 'done'
end
end
#=> sample.rb:4:in `sleep': execution expired (Timeout::Error)
~~~
`TimeoutError` の代わりに `Timeout::ExitException` を指定すれば働きます。
~~~ruby
require 'timeout'
Thread.handle_interrupt(Timeout::ExitException => :never) do
timeout(1) do
sleep 2
p 'done'
end
end
#=> "done"
#=> sample.rb:2:in `handle_interrupt': execution expired (Timeout::ExitException)
~~~
これは意図された挙動でしょうか。
なお、るりまだけじゃなく、thread.c 中のコメントにも同様の記述があります。
--
https://bugs.ruby-lang.org/