我们有一个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。)
答案 0 :(得分:2)
由于某些外部事件,sleep
函数家族可以提前返回。
原则上,解决此问题的方法是计算出您要唤醒的时间,然后根据该时间点有多远来调用睡眠。如果您遇到EINTR异常,只需根据当前时间修改睡眠时间即可再次进入睡眠。