在 time.sleep() 中使用 Python on Windows "Interrupted function call"例外?



我们有一个Python脚本,在Windows上每晚运行,它偶尔会轮询服务器,然后使用time.sleep()休眠大约30分钟。

大多数时候这都很好,但偶尔我们会得到

00:49:48 Sleeping for 29.7765000025 minutes, for a total delay of 30 minutes
00:49:48 Traceback (most recent call last):
00:49:48   File "somescript.py", line 15, in <module>
00:49:48     print(somemodule.wait_for_execution_success(someguid, poll_time_in_minutes=5))
00:49:48   File "somemodule.py", line 82, in wait_for_execution_success
00:49:48     time.sleep(poll_time_in_minutes*60)
00:49:48 IOError: [Errno 4] Interrupted function call

这可能是什么原因造成的?更重要的是,我们如何避免这种情况?

当然,我可以用try:except IOError: pass来包装它,但不知何故,这感觉像是一种变通方法。

我在interwebs上唯一能找到的就是尝试从pywin32模块切换到win32api.Sleep()。(我找不到任何文档,但源代码以及微软关于SleepEx函数的文档建议我只调用win32api.Sleep(30*60*1000)。(但我不喜欢有额外的依赖项。更重要的是,这能解决上述问题吗?

(如果重要的话,这是Python 2.7.14。(

由于某些外部事件,sleep函数族可能会提前返回。

原则上,解决这个问题的方法是计算出你想醒来的时间,然后根据该时间点的距离称为睡眠。如果你遇到EINTR异常,只需根据当前时间重新调整睡眠时间。

最新更新