From: nobu@... Date: 2015-07-10T13:16:02+00:00 Subject: [ruby-dev:49180] [Ruby trunk - Bug #11344] Thread.handle_interrupt(TimeoutError => :never) が効かない Issue #11344 has been updated by Nobuyoshi Nakada. Description updated Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: WONTFIX, 2.1: REQUIRED, 2.2: REQUIRED 2.1にはそのままバックポートできるか分かりませんが、REQUIREDにしておきます。 2.0も動作は同じなのですが、`throw`/`catch`を使うようにするところからバックポートしないといけないので、とりあえずWONTFIXにしておきます。 ---------------------------------------- Bug #11344: Thread.handle_interrupt(TimeoutError => :never) が効かない https://bugs.ruby-lang.org/issues/11344#change-53362 * 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 ---------------------------------------- るりま によると、`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/