当我按下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!'
答案 0 :(得分:3)
来自Python docs:
实际暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获程序后终止sleep()。
即。循环确实完成了它的执行(正如你在信号处理程序的"bye"
之后输出的"quitting!"
所看到的那样),它只是sleep
被缩短了。
如果你有比sleep
更重要的东西,我相信你会看到你原本想要的东西。
答案 1 :(得分:2)
信号中断睡眠调用,继续循环,条件为False,因此它终止循环。 Python不会恢复睡眠调用。
顺便说一下,Python解释器通常会捕获SIGINT本身,并将其转换为 KeyboardInterrupt 异常,您可以捕获它而不是使用信号模块。