为什么只有主线程才能在Python中设置信号处理程序

时间:2017-05-24 07:35:40

标签: python

在python的信号处理语义中,只有主线程可以设置信号处理程序,只有主线程可以调用信号处理程序。

为什么这样设计?

2 个答案:

答案 0 :(得分:4)

此评论显示在cpython源文件signalmodule.c中:

  

/ *有关信号与线程之间相互作用的说明

     

当支持线程时,我们需要以下语义:

     
      
  • 只有主线程可以设置信号处理程序
  •   
  • 任何线程都可以获得信号处理程序
  •   
  • 信号仅传递给主线程
  •   
     

即。我们不支持像SIGFPE这样的“同步信号”   无论如何,这在Python中没有多大意义)我们也不支持   信号作为线程间通信的手段,因为不是全部   线程实现支持(至少我们的线程库
  不)。

     

我们仍然存在一些问题,即在某些实现中信号
  由键盘产生的(例如SIGINT)被传递给所有人   线程(例如SGI),而在其他线程(例如Solaris)中,这种信号是
  交付给一个随机线程(中间可能性为   将它传递给主线程 - POSIX?)。现在,我们有一个   工作实现适用于所有三种情况 - 处理程序   如果getpid()与主线程中的不一样,则忽略信号。

     

XXX这是一个黑客攻击。

     

* /

我对此的解读是,设置信号处理程序的限制是通过避免必须应对os级信号实现的差异来简化cpython中信号处理的实现。

答案 1 :(得分:-1)

因为Python signal模块以这种方式实现它。我相信部分是因为没有简单的方法(如果有的话)通过信号处理程序从非主线程锁定GIL。所以我宁愿说出它的GIL限制。

您可能对此感兴趣:http://www.dabeaz.com/python/UnderstandingGIL.pdf