中断信号使Python进程从睡眠状态唤醒并从中断处继续?

时间:2016-06-28 10:46:02

标签: python multithreading operating-system signals interrupt

以下代码将每5秒打印一次当前时间,并使用int_handler处理键盘中断信号。

from signal import *
import time
from datetime import datetime


def int_handler(*args):
    print 'interrupted'

signal(SIGINT, int_handler)

while True:
    print datetime.now()
    time.sleep(5)

但是,每次按 Ctrl - C 时,它会立即打印出当前时间,然后继续运行。

2016-06-28 18:17:19.441574
2016-06-28 18:17:24.446659
2016-06-28 18:17:29.451759
2016-06-28 18:17:34.452328
^Cinterrupted
2016-06-28 18:17:37.244227
^Cinterrupted
2016-06-28 18:17:37.692217
^Cinterrupted
2016-06-28 18:17:38.236343
^Cinterrupted
2016-06-28 18:17:38.572194
2016-06-28 18:17:43.577122
2016-06-28 18:17:48.577242

似乎中断使进程从休眠状态唤醒,处理程序被执行,并以某种方式再次返回到while循环。

有人可以向我解释原因吗?谢谢!

1 个答案:

答案 0 :(得分:1)

来自sleep()的文档:

  

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

https://docs.python.org/3/library/time.html#time.sleep

所以你所描述的正是发生的事情:在处理信号处理程序中的信号后,在睡眠后继续执行,这是你的while循环中的最后一个表达式。

因此,为了真正睡眠大约5秒而忽略中断,您必须在睡眠前存储时间并检查已经过了足够的时间,或者再睡一些。