Документация 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 секунд, независимо от того, когда происходит прерывание.
Как предполагает Томас К., лучшей стратегией было бы использование потоков и синхронизации.