Windows上的Python中time.sleep()中的“中断的函数调用”异常?

时间:2018-12-14 08:47:57

标签: python sleep pywin32

我们有一个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包装它,但是以某种方式感觉像是一种解决方法。

我在互联网上唯一能找到的就是尝试从pywin32模块切换到win32api.Sleep()。 (我找不到任何文档,但是the source code以及Microsoft在基础SleepEx function上的文档建议我应该只打电话给win32api.Sleep(30*60*1000)。)但是我不希望有其他依赖项。更重要的是,这样可以解决上述问题吗?

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

1 个答案:

答案 0 :(得分:2)

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

原则上,解决此问题的方法是计算出您要唤醒的时间,然后根据该时间点有多远来调用睡眠。如果您遇到EINTR异常,只需根据当前时间修改睡眠时间即可再次进入睡眠。