Как заставить таймер прервать процесс ожидания? - PullRequest
0 голосов
/ 18 января 2012

Я пытаюсь реализовать сигналы тревоги в программе, которая использует стандартный цикл чтения-чтения-печати. ​​

Примером кода может быть что-то вроде этого:

while True:
    input = get_input() # A function that waits for input and 
                        # returns the input once it is obtained
    set_alarm(interpret(input)) # A function that sets the alarm

Set_alarmиспользует класс threading.Timer.Хотя есть одна проблема с этим.Таймер активируется по времени, но когда get_input () ожидает ввода, таймер будет ожидать завершения этого процесса, прежде чем выдать требуемый вывод.

Есть ли способ для функции обратного вызова таймера:прервать функцию ожидания и выдать вывод сразу после ее активации?

Спасибо!

1 Ответ

0 голосов
/ 18 января 2012

CPython проверяет наличие сигналов между отдельными шагами Python. Вполне вероятно, что get_input () владеет глобальной блокировкой интерпретатора, и обработка сигнала будет отложена до тех пор, пока не вернется get_input.

Решение состоит в том, чтобы использовать неблокирующие вызовы, чтобы запросить ввод данных пользователем с учетом времени ожидания. В зависимости от вашей платформы вы можете использовать kbhit или выбрать (с помощью stdin), чтобы получить пользовательский ввод.

...