本文简要介绍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 Thread.kill用法及代码示例
- Ruby Thread.pending_interrupt?用法及代码示例
- Ruby Thread.report_on_exception用法及代码示例
- Ruby Thread.group用法及代码示例
- Ruby Thread.list用法及代码示例
- Ruby Thread.ignore_deadlock =用法及代码示例
- Ruby Thread.stop用法及代码示例
- Ruby Thread.abort_on_exception=用法及代码示例
- Ruby Thread.stop?用法及代码示例
- Ruby Thread.new用法及代码示例
- Ruby Thread.report_on_exception=用法及代码示例
- Ruby Thread.value用法及代码示例
- Ruby Thread.run用法及代码示例
- Ruby Thread.thread_variables用法及代码示例
- Ruby Thread.thread_variable?用法及代码示例
- Ruby Thread.thr[sym]用法及代码示例
- Ruby Thread.thread_variable_get用法及代码示例
- Ruby Thread.status用法及代码示例
- Ruby Thread.priority=用法及代码示例
- Ruby Thread.key?用法及代码示例
- Ruby Thread.keys用法及代码示例
- Ruby Thread.alive?用法及代码示例
- Ruby Thread.priority用法及代码示例
- Ruby Thread.raise用法及代码示例
- Ruby Thread.current用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Thread.handle_interrupt。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。