为什么这会立即退出SIGKILL?

时间:2012-12-03 01:27:34

标签: python signals interrupt

当我按下Ctrl-C时,以下代码会立即终止。

但是,似乎循环应在10秒延迟后退出 - 因为在我们到达循环顶部之前,它不会检查keep_going的状态。为什么这段代码会立即退出循环?

如何在退出之前确保循环完成执行?

import signal
import time

keep_going = True

def signal_handler(signal, frame):
    global keep_going
    print 'quitting!'
    keep_going = False

signal.signal(signal.SIGINT, signal_handler) 

while keep_going:
    print 'looping...'
    time.sleep(10)
    print 'bye!'

2 个答案:

答案 0 :(得分:3)

来自Python docs

  

实际暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获程序后终止sleep()。

即。循环确实完成了它的执行(正如你在信号处理程序的"bye"之后输出的"quitting!"所看到的那样),它只是sleep被缩短了。

如果你有比sleep更重要的东西,我相信你会看到你原本想要的东西。

答案 1 :(得分:2)

信号中断睡眠调用,继续循环,条件为False,因此它终止循环。 Python不会恢复睡眠调用。

顺便说一下,Python解释器通常会捕获SIGINT本身,并将其转换为 KeyboardInterrupt 异常,您可以捕获它而不是使用信号模块。