为什么SIGKILL会马上停止?

2024-06-02 06:46:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 代码importtruesignaltime状态defglobal
2条回答

来自Python docs

The actual suspension time may be less than that requested because any caught signal will terminate the sleep() following execution of that signal’s catching routine.

也就是说,循环确实完成了它的执行(从信号处理程序的"quitting!"之后输出的"bye")可以看出,只有sleep被截断了。在

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

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

顺便说一句,Python解释器通常会捕捉SIGINT本身,并将其转换为一个键盘中断异常,您可以捕捉该异常,而不是使用信号模块。在

相关问题 更多 >