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)
我有以下代码,它按预期工作:
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)