捕获信号后如何终止time.sleep?

问题描述

在Python 3.5中,WITH yourTable AS ( SELECT 'TTTTTTTThaT was great!' AS col ) SELECT REGEXP_REPLACE(col,'([a-zA-Z])\\1{2,}','$1$1') FROM yourTable; 的行为已更改:

函数现在至少休眠time.sleep(secs),即使该休眠被信号中断,除非信号处理程序引发异常

(来源:time - Python Documentation

然后,如何使信号处理程序返回后剩余的几秒钟secs 不睡觉?

我想出的解决方案如下所示。该示例可以完美运行,但是在实际代码中,这是不切实际的,因为引发异常可能会影响不需要的代码部分。

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 之后取消设置信号处理程序,但是它似乎很脏。有什么优雅的方法吗?

解决方法

SIGINT的默认Python信号处理程序设置一个Windows事件对象:sigint_event。

time.sleep()通过WaitForSingleObjectEx()实现,它使用time.sleep()参数作为超时等待sigint_event对象。因此,可以通过SIGINT中断睡眠。

_winapi.WaitForMultipleObjects()自动将sigint_event添加到监视的句柄列表中,因此它也可以被中断。