当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Thread.handle_interrupt用法及代码示例


本文简要介绍ruby语言中 Thread.handle_interrupt 的用法。

用法

handle_interrupt(hash) { ... } → result of the block

更改异步中断时序。

interrupt 表示异步事件和相应的过程,由 Thread#raise Thread#kill 、信号陷阱(尚不支持)和主线程终止(如果主线程终止,则所有其他线程将被杀死)。

给定的 hash 有像 ExceptionClass => :TimingSymbol 这样的对。其中ExceptionClass 是给定块处理的中断。 TimingSymbol 可以是以下符号之一:

:immediate

立即调用中断。

:on_blocking

BlockingOperation 时调用中断。

:never

永远不要调用所有中断。

BlockingOperation表示该操作会阻塞调用线程,比如读写。在 CRuby 实现中,BlockingOperation 是在没有 GVL 的情况下执行的任何操作。

被屏蔽的异步中断被延迟,直到它们被启用。此方法类似于 sigprocmask(3)。

NOTE

异步中断很难使用。

如果需要线程间通信,请考虑使用另一种方式,例如 Queue

或者在对这种方法有深刻理解的情况下使用它们。

用法

在这个例子中,我们可以防止 Thread#raise 异常。

使用:never TimingSymbol RuntimeError 异常将始终在主线程的第一个块中被忽略。在第二个 ::handle_interrupt 块中,我们可以有目的地处理 RuntimeError 异常。

th = Thread.new do
  Thread.handle_interrupt(RuntimeError => :never) {
    begin
      # You can write resource allocation code safely.
      Thread.handle_interrupt(RuntimeError => :immediate) {
        # ...
      }
    ensure
      # You can write resource deallocation code safely.
    end
  }
end
Thread.pass
# ...
th.raise "stop"

虽然我们忽略了 RuntimeError 异常,但编写我们的资源分配代码是安全的。然后,确保块是我们可以安全地释放您的资源的地方。

保护 Timeout::Error

在下一个示例中,我们将防范 Timeout::Error 异常。这将有助于防止在正常确保子句期间发生 Timeout::Error 异常时泄漏资源。对于这个例子,我们使用标准库 Timeout 的帮助,来自 lib/timeout.rb

require 'timeout'
Thread.handle_interrupt(Timeout::Error => :never) {
  timeout(10){
    # Timeout::Error doesn't occur here
    Thread.handle_interrupt(Timeout::Error => :on_blocking) {
      # possible to be killed by Timeout::Error
      # while blocking operation
    }
    # Timeout::Error doesn't occur here
  }
}

timeout 块的第一部分,我们可以依赖 Timeout::Error 被忽略。然后在Timeout::Error => :on_blocking 块中,任何将阻塞调用线程的操作都容易受到引发 Timeout::Error 异常的影响。

堆栈控制设置

可以堆叠多个级别的 ::handle_interrupt 块,以便一次控制多个ExceptionClass 和TimingSymbol。

Thread.handle_interrupt(FooError => :never) {
  Thread.handle_interrupt(BarError => :never) {
     # FooError and BarError are prohibited.
  }
}

ExceptionClass 的继承

将考虑从ExceptionClass 参数继承的所有异常。

Thread.handle_interrupt(Exception => :never) {
  # all exceptions inherited from Exception are prohibited.
}

要处理所有中断,请使用 Object 而不是 Exception 作为 ExceptionClass,因为 Exception 不处理终止/终止中断。

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Thread.handle_interrupt。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。