显然GIL会阻止线程之间切换上下文以保护引用计数,但CPython中的信号处理是否完全安全?
答案 0 :(得分:1)
Python中的信号由一个非常简单的信号处理程序捕获,实际上,它只是调度在主线程上调用的实际信号处理函数。 C信号处理程序不会触及任何Python对象,因此它不会有破坏任何状态的风险,而Python信号处理程序在字节码op评估之间执行,所以它也不会破坏CPython的内部状态。
答案 1 :(得分:0)
可以在参考计数操作的中间传递和处理信号。如果你想知道为什么CPython不使用原子CPU指令进行引用计数:它们太慢了。原子操作使用内存屏障来同步CPU缓存(L1,L2,共享L3)和CPU(ccNUMA)。您可以想象它会阻止大量优化。现代CPU非常快,速度太快,以至于他们花了很多时间做什么,只是等待数据。参考增量和减量是CPython中非常常见的操作。内存障碍可以防止无序执行,这是一个非常重要的优化技巧。
引用计数代码是经过精心编写的,并考虑了多线程和信号。信号处理程序也不能像线程那样访问部分创建或销毁的Python对象。像Py_CLEAR
这样的宏处理边缘情况。 I / O功能也可以处理EINTR。 3.3有一个改进的子进程模块,它只使用fork()和execvpe()之间的异步信号安全函数。
你不必担心。我们有一些聪明的人非常了解他们的POSIX。