围绕Python线程的规则是什么?如何处理Unix信号?

KeyboardInterrupt触发但由Python运行时在内部处理的SIGINT是否以不同的方式处理?

最佳答案

首先,在使用 signal 模块设置信号处理程序时,必须在主线程中创建它们。如果尝试在单独的线程中创建它们,将会收到异常。

通过signal.signal()函数注册的信号处理程序将始终在主线程中调用。在支持将信号发送到线程的体系结构上,我相信在C级,Python运行时会忽略线程上的所有信号,并在主线程上具有信号处理程序,该处理程序用于将其分派(dispatch)给您的Python代码信号处理程序。
thread模块的文档指出, KeyboardInterrupt 异常(通常由SIGINT触发)可以是delivered to an arbitrary thread,除非您拥有可用于所有Unix系统的signal模块。在这种情况下,它将被传递到主线程。如果您使用的系统没有signal,则必须在线程中捕获KeyboardInterrupt,然后调用 thread.interrupt_main() 在主线程中重新引发它。

可以在python文档中找到有关 thread signal 模块的更多信息。

10-07 19:30
查看更多