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

时间:2015-06-27 14:55:41

标签: 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)

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

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

1 个答案:

答案 0 :(得分:1)

这确实很奇怪!

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

  • 使用或不使用print语句,您的代码在Python 3中完美运行。
  • 如果您将信号处理程序内的睡眠状态更改为" sleep(60)"如果在达到打印之前按Ctrl-C,您会注意到仍然正常工作! (这让我怀疑)。

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

根据这个问题,这在Python 3及更高版本中得到了修复,但在早期版本中没有修复。