首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在捕获信号后终止time.sleep()?

如何在捕获信号后终止time.sleep()?
EN

Stack Overflow用户
提问于 2020-09-09 03:01:46
回答 1查看 349关注 0票数 1

在Python3.5中,time.sleep(secs)的行为被更改:

这个函数现在至少睡眠secs,即使睡眠被信号打断,除非信号处理程序引发异常。

(资料来源:)

那么,在信号处理程序返回(如Python3.4或更低版本)之后的剩余几秒钟,我如何使time.sleep() 而不是睡眠呢?

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

代码语言:javascript
复制
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()之后取消信号处理程序,但它似乎很脏。有什么优雅的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-09-09 03:08:59

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

time.sleep()是用WaitForSingleObjectEx()实现的,它使用time.sleep()参数作为超时等待sigint_event对象。所以睡眠可以被SIGINT打断。

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63804168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档