在Python3.5中,time.sleep(secs)
的行为被更改:
这个函数现在至少睡眠
secs
,即使睡眠被信号打断,除非信号处理程序引发异常。
(资料来源:)
那么,在信号处理程序返回(如Python3.4或更低版本)之后的剩余几秒钟,我如何使time.sleep()
而不是睡眠呢?
我想出的解决方案如下所示。这个示例工作得很完美,但在实际代码中,这是不切实际的,因为引发异常可能会影响代码中不需要的部分。
import signal
import time
class SleepInterruptException(Exception):
pass
def signal_handler(signal, frame) -> None:
raise SleepInterruptException()
signal.signal(signal.SIGINT, signal_handler)
try:
time.sleep(10)
except SleepInterruptException:
pass
解决此问题的方法之一可能是在time.sleep()
之后取消信号处理程序,但它似乎很脏。有什么优雅的方法吗?
发布于 2020-09-09 03:08:59
SIGINT的默认Python处理程序设置一个Windows对象: sigint_event。
time.sleep()是用WaitForSingleObjectEx()实现的,它使用time.sleep()参数作为超时等待sigint_event对象。所以睡眠可以被SIGINT打断。
_winapi.WaitForMultipleObjects()自动将sigint_event添加到监视句柄列表中,因此它也可以被中断。
https://stackoverflow.com/questions/63804168
复制相似问题