所以,让我说我有这个代码:
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 之前存在的异常之间的微妙交互。注意两件事:
如果您阅读Python bug tracker 中的问题 12472,您将看到 Python 在下一条指令(在本例中为 print)Py_CheckSleep 之前插入一个内部调用,这会导致在睡眠中断时捕获信号。如果没有打印,则不会进行额外检查。
根据该问题,这个问题在 Python 3 及更高版本中已修复,但在早期版本中尚未修复。
| 归档时间: | 
 | 
| 查看次数: | 79 次 | 
| 最近记录: |