在Python的信号处理语义中,只有主线程可以设置信号处理程序,并且只有主线程可以调用信号处理程序。
为什么要这样设计呢?
此注释出现在 cpython 源文件中信号模块.c https://github.com/python/cpython/blob/master/Modules/signalmodule.c#L63:
/* 关于信号和线程之间交互的注释
当支持线程时,我们需要以下语义:
- 只有主线程可以设置信号处理程序
- 任何线程都可以获得信号处理程序
- 信号仅传递到主线程
IE。我们不支持“同步信号”,例如 SIGFPE(捕获
无论如何,这在 Python 中没有多大意义)我们也不支持
信号作为线程间通信的一种手段,因为并非所有
线程实现支持这一点(至少我们的线程库
没有)。
我们仍然存在一个问题,在某些实现中信号
由键盘生成的信号(例如 SIGINT)被传递给所有
线程(例如 SGI),而在其他(例如 Solaris)中,此类信号是
传递给一个随机线程(一种中间可能性是
是将其传递给主线程——POSIX?)。目前,我们有一个
在所有三种情况下都有效的工作实现——处理程序
如果 getpid() 与主线程中的不同,则忽略信号。
XXX 这是一个黑客行为。
*/
我对此的解读是,设置信号处理程序的限制是通过避免处理操作系统级信号实现的差异来简化 cpython 中信号处理的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)