在python的信号处理语义中,只有主线程可以设置信号处理程序,只有主线程可以调用信号处理程序。
为什么这样设计?
答案 0 :(得分:4)
此评论显示在cpython源文件signalmodule.c中:
/ *有关信号与线程之间相互作用的说明
当支持线程时,我们需要以下语义:
- 只有主线程可以设置信号处理程序
- 任何线程都可以获得信号处理程序
- 信号仅传递给主线程
即。我们不支持像SIGFPE这样的“同步信号” 无论如何,这在Python中没有多大意义)我们也不支持 信号作为线程间通信的手段,因为不是全部 线程实现支持(至少我们的线程库
不)。我们仍然存在一些问题,即在某些实现中信号
由键盘产生的(例如SIGINT)被传递给所有人 线程(例如SGI),而在其他线程(例如Solaris)中,这种信号是
交付给一个随机线程(中间可能性为 将它传递给主线程 - POSIX?)。现在,我们有一个 工作实现适用于所有三种情况 - 处理程序 如果getpid()与主线程中的不一样,则忽略信号。XXX这是一个黑客攻击。
* /
我对此的解读是,设置信号处理程序的限制是通过避免必须应对os级信号实现的差异来简化cpython中信号处理的实现。
答案 1 :(得分:-1)
因为Python signal
模块以这种方式实现它。我相信部分是因为没有简单的方法(如果有的话)通过信号处理程序从非主线程锁定GIL。所以我宁愿说出它的GIL限制。