我们有一个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异常,只需根据当前时间重新调整睡眠时间。