首页 > 解决方案 > 时间为零的signal.setitimer,后跟signal.pause不起作用

问题描述

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

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)

标签: pythonpython-3.xsignals

解决方案


的文档signal.setitimer说,如果secondsarg 为 0,这将清除计时器:

setitimer(which, seconds, interval=0.0, /)
    设置给定的计时器(ITIMER_REAL、ITIMER_VIRTUAL 或 ITIMER_PROF 之一)。

    计时器将在 value 秒后触发,之后每隔间隔秒触发一次。
    可以通过将秒数设置为零来清除计时器。

    将旧值作为元组返回:(延迟,间隔)。

这反映了底层 POSIX setitimer系统调用的行为:

it_value设置为 0 将禁用计时器,无论it_interval的值如何。 

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

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

推荐阅读