Есть ли способ остановить time.sleep в окнах? - PullRequest
6 голосов
/ 08 декабря 2011

In * nix python сигнализация позволяет мне прекратить сон до того, как он будет готов.Есть ли подобный механизм, доступный в Windows - кажется, что все методы перехватывают код только после сна?

Пример кода:

from time import sleep
.. do something that will intercept the sleep
try:
    sleep(60)
finally:
    print 'how to get here under 60 seconds in windows?'

Подобный вопрос, который не имеетОтвет для Windows: прерывать / прерывать time.sleep () в python

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Документация Python для signal гласит:

• Хотя обработчики сигналов Python вызываются асинхронно, насколько это касается пользователя Python, они могут происходить только между «атомарными» инструкциямиИнтерпретатор Python.Это означает, что сигналы, поступающие во время длинных вычислений, реализованных исключительно на языке C (например, совпадения с регулярными выражениями в больших текстах), могут задерживаться на произвольное время.

, тогда как time говорит:

Фактическое время приостановки может быть меньше запрошенного, потому что любой перехваченный сигнал прервет режим сна () после выполнения процедуры перехвата этого сигнала.

В Windows, по-видимому, time.sleep() не реализован в соответствии с документацией, потому что обработчик для сигнала, полученного во время сна, не обрабатывается до тех пор, пока не закончится полная продолжительность сна.Следующий пример:

import signal, time

def handler(signum, frame):
    print('Signal handler called with signal', signum)

signal.signal(signal.SIGINT, handler)

print("signal set, sleeping")
time.sleep(10)
print("sleep done")

печатает:

signal set, sleeping
Signal handler called with signal 2
sleep done

, причем первая строка появляется сразу, а вторая - через 10 секунд, независимо от того, когда происходит прерывание.

Как предполагает Томас К., лучшей стратегией было бы использование потоков и синхронизации.

1 голос
/ 20 октября 2012

Я не уверен, что это поможет вам, но вот небольшой обходной путь, который вы могли бы сделать:

for i in range(60):
    if checkIfIShouldInterruptSleep():
         break
    time.sleep(1)
print "Finished Sleeping!"

Это только с точностью до секунды, но может служить вашей цели. Удачного кодирования!

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