Исключение «прерванный вызов функции» в time.sleep () с Python для Windows? - PullRequest
0 голосов
/ 14 декабря 2018

У нас есть скрипт Python, работающий по ночам в Windows, который время от времени опрашивает сервер, а затем переходит в режим сна на 30 минут, используя time.sleep().

Большинствовремя это работает нормально, но иногда мы получаем

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, конечно, но как-то это похоже на обходной путь.

Единственное, что я могуможно было найти на межсетях, чтобы попытаться переключиться на win32api.Sleep() с pywin32 модуля.(Я не могу найти никакой документации, но исходный код вместе с документацией Microsoft по базовой функции SleepEx предлагают мне просто позвонить win32api.Sleep(30*60*1000).) Но мне не нравитсяиметь дополнительную зависимость.И что еще более важно, это решит вышеуказанную проблему?

(Это с Python 2.7.14, если это имеет значение.)

1 Ответ

0 голосов
/ 14 декабря 2018

Семейство функций sleep может вернуться рано из-за какого-то внешнего события.

В принципе, подход к этой проблеме состоит в том, чтобы определить время, когда вы хотите проснуться, а затем вызвать режим снао том, как далеко этот момент времени.Если вы получили исключение EINTR, просто снова спите с пересмотренной продолжительностью, основанной на текущем времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...