signal.setitimer 时间为零后跟 signal.pause 不工作

signal.setitimer with time zero followed by signal.pause not working

我有以下代码,它按预期工作:

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)

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 it_value to 0 shall disable a timer, regardless of the value of it_interval. 

在 POSIX 系统上,it_value 是 timeval struct,其精度以微秒为单位。因此,如果您可以在计时器首次触发之前容忍非常小的延迟,只需使用非常小的 arg 调用 setitimer,小至 1 微秒:

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