围绕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
模块的更多信息。