signal.setitimer с нулевым временем, за которым следует signal.pause - PullRequest
1 голос
/ 03 октября 2019

У меня есть следующий код, и он работает, как и ожидалось:

import signal

def printer(signum, frame):
    print("hi!")

signal.signal(signal.SIGALRM, printer)
signal.setitimer(signal.ITIMER_REAL, 0.1, 3.0)

while(True):
    signal.pause()

Я хотел бы использовать signal.setitimer(signal.ITIMER_REAL, 0.0, 3.0), но для правильного запуска таймера нужно немного подождать: signal.setitimer(signal.ITIMER_REAL, 0.1, 3.0). Что тут происходит? Есть ли способ запустить таймер мгновенно?

(работает только в Linux)

1 Ответ

1 голос
/ 03 октября 2019

В документации для signal.setitimer сказано, что если seconds arg равно 0, таймер будет очищен:

setitimer(which, seconds, interval=0.0, /)
    Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL or ITIMER_PROF).

    The timer will fire after value seconds and after that every interval seconds.
    The itimer can be cleared by setting seconds to zero.

    Returns old values as a tuple: (delay, interval).

Это отражает поведение базового POSIX setitimer системный вызов:

Setting <i>it_value</i> to 0 shall disable a timer, regardless of the value of <i>it_interval</i>. 

В системах POSIX it_value является временной структурой , точность которой измеряется в микросекундах. Поэтому, если вы можете допустить очень маленькую задержку перед первым срабатыванием таймера, просто вызовите setitimer с очень маленьким числом, равным 1 микросекунде:

signal.setitimer(signal.ITIMER_REAL, 0.000001, 3.0)
...