围绕 Python 线程的规则是什么以及如何处理 Unix 信号?
是由 Python 运行时KeyboardInterrupt
触发SIGINT
但在内部处理的,处理方式不同吗?
围绕 Python 线程的规则是什么以及如何处理 Unix 信号?
是由 Python 运行时KeyboardInterrupt
触发SIGINT
但在内部处理的,处理方式不同吗?
首先,在使用模块设置信号处理程序时signal
,您必须在主线程中创建它们。如果您尝试在单独的线程中创建它们,您将收到异常。
通过该函数注册的信号处理程序signal.signal()
将始终在主线程中调用。在支持向线程发送信号的架构上,在 C 级别,我相信 Python 运行时会忽略线程上的所有信号,并且在主线程上有一个信号处理程序,它用于分派给你的 Python 代码信号处理程序。
该thread
模块的文档声明KeyboardInterrupt
异常(通常由 触发SIGINT
)可以传递到任意线程,除非您拥有signal
所有 Unix 系统都应该拥有的模块。在这种情况下,它被传递到主线程。如果您在没有 的系统上signal
,则必须KeyboardInterrupt
在线程中捕获并调用thread.interrupt_main()
以在主线程中重新引发它。
从signal
文档中:
如果在同一个程序中同时使用信号和线程,则必须小心。同时使用信号和线程时要记住的基本事项是:始终在执行
signal()
的主线程中执行操作。任何线程都可以执行alarm()
,getsignal()
,pause()
,setitimer()
orgetitimer()
; 只有主线程可以设置新的信号处理程序,并且主线程将是唯一接收信号的线程(这是由 Python 信号模块强制执行的,即使底层线程实现支持向单个线程发送信号)。这意味着信号不能用作线程间通信的手段。改用锁。