python - 在睡眠调用之间捕获信号

wes*_*tem 6 python python-2.7

所以,让我说我有这个代码:

import signal
from time import sleep

def signalHandler(sig, frame):
    print "signalHandler"
    while True:
        sleep(1)
        #print "Caught" # Uncomment this line, and you get multiple signals - commented, you don't.

signal.signal(signal.SIGINT, signalHandler)
while True:
    sleep(1)
Run Code Online (Sandbox Code Playgroud)

如注释中所示,如果取消注释print语句,则代码正常工作,并且信号处理程序将捕获任何后续的CTRL-C按下.但是,如果留下评论,将永远不会捕获另一个信号.

为什么是这样?我的猜测是连续的睡眠调用被混合在一起,并且控制永远不会回到python来捕获信号.它必须为打印声明做什么.任何人都可以对此有所了解吗?

Gar*_*ski 1

这确实很奇怪!

我相信这是 Python 生成的字节码的内部与 Python 2.7 之前存在的异常之间的微妙交互。注意两件事:

  • 无论有没有 print 语句,您的代码都可以在 Python 3 中完美运行。
  • 如果您将信号处理程序中的睡眠更改为“睡眠(60)”,您会发现,如果您在打印到达之前按下 Ctrl-C,它仍然可以正常工作!(这就是让我怀疑的原因)。

如果您阅读Python bug tracker 中的问题 12472,您将看到 Python 在下一条指令(在本例中为 print)Py_CheckSleep 之前插入一个内部调用,这会导致在睡眠中断时捕获信号。如果没有打印,则不会进行额外检查。

根据该问题,这个问题在 Python 3 及更高版本中已修复,但在早期版本中尚未修复。