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

Jac*_*cky 5 python

在python的信号处理语义中,只有主线程才能设置信号处理程序,并且只有主线程才能调用信号处理程序。

为什么要这样设计?

sna*_*erb 7

此注释出现在 cpython 源文件signalmodule.c中:

/* 关于信号和线程之间交互的注释

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

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

也就是说,我们不支持像 SIGFPE 这样的“同步信号”(
无论如何捕获这个信号在 Python 中没有多大意义),我们也不支持
信号作为线程间通信的手段,因为并非所有
线程实现都支持这一点(至少我们的线程库
没有)。

我们仍然遇到这样的问题:在某些实现中,
键盘生成的信号(例如 SIGINT)被传递到所有
线程(例如 SGI),而在其他实现中(例如 Solaris),此类信号被
传递到一个随机线程(一种中间可能性
是将其传递到主线程——POSIX?)。目前,我们有一个适用于所有三种情况的工作实现——如果 getpid() 与主线程中的不同,则处理程序将忽略信号。

XXX 这是一个黑客行为。

*/

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