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

python-在睡眠调用之间捕获信号,python,python-2.7,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.sign

假设我有以下代码:

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来捕捉信号。对于打印语句,它必须这样做。有人能洞察到这一点吗?

这确实很奇怪

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

  • 无论是否使用print语句,您的代码在Python3中都能完美工作
  • 如果您将信号处理程序中的休眠更改为“sleep(60)”,您会注意到,如果在打印之前按Ctrl-C,它仍然可以正常工作!(这就是我怀疑的原因)
如果您阅读,您将看到Python在下一条指令(在本例中为您的打印)之前插入对
Py_CheckSleep
的内部调用,这会导致在睡眠中断时捕获信号。如果没有打印,则不会进行额外检查


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

您是否尝试过添加
signal.pause()
?你到底想做什么?我试着处理多个CTRL-C键,并注意到了这种行为。幸运的是,我能够解决“signal.signal(signal.SIGINT,signal.SIG_IGN)”的问题,因为忽略另一个CTRL-C键对我来说很好。我只是不知道睡眠在做什么,使信号不再注册。