0

显然,GIL 会阻止在线程之间切换上下文以保护引用计数,但 CPython 中的信号处理是否完全安全?

4

2 回答 2

1

Python 中的信号由一个非常简单的信号处理程序捕获,实际上,它只是安排在主线程上调用实际的信号处理程序函数。C 信号处理程序不接触任何 Python 对象,因此不会破坏任何状态,而 Python 信号处理程序在字节码操作评估之间执行,因此它也不会破坏 CPython 的内部状态。

于 2013-09-08T01:48:53.537 回答
0

可以在引用计数操作的中间传递和处理信号。如果您想知道为什么 CPython 不使用原子 CPU 指令进行引用计数:它们太慢了。原子操作使用内存屏障来同步 CPU 缓存(L1、L2、共享 L3)和 CPU (ccNUMA)。正如你可以想象的那样,它阻止了很多优化。现代 CPU 的速度非常快,以至于他们花了很多时间除了等待数据什么都不做。引用递增和递减是 CPython 中非常常见的操作。内存屏障防止乱序执行,这是一个非常重要的优化技巧。

引用计数代码经过精心编写,并考虑了多线程和信号。信号处理程序不能访问部分创建或销毁的 Python 对象,就像线程也不能一样。宏喜欢Py_CLEAR处理边缘情况。I/O 函数也负责 EINTR。3.3 有一个改进的子进程模块,它在 fork() 和 execvpe() 之间仅使用异步信号安全函数。

你不必担心。我们有一些聪明的人非常了解他们的 POSIX fu。

于 2013-09-08T01:38:15.247 回答