如何解决捕获信号后如何终止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)
,即使该休眠被信号中断,除非信号处理程序引发异常
然后,如何使信号处理程序返回后剩余的几秒钟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添加到监视的句柄列表中,因此它也可以被中断。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。