1

当我按下 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!'
4

2 回答 2

3

来自Python 文档

实际的挂起时间可能少于请求的时间,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。

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

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

于 2012-12-03T01:35:37.693 回答
2

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

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

于 2012-12-03T01:35:05.357 回答