python计时器之谜

jld*_*ont 8 python signals timer

好吧,至少对我来说是一个谜.考虑以下:

import time
import signal

def catcher(signum, _):
    print "beat!"

signal.signal(signal.SIGALRM, catcher)
signal.setitimer(signal.ITIMER_REAL, 2, 2)

while True:
    time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

按预期工作,即提供"节拍!" 消息每2秒.接下来,没有产生输出:

import time
import signal

def catcher(signum, _):
    print "beat!"

signal.signal(signal.SIGVTALRM, catcher)
signal.setitimer(signal.ITIMER_VIRTUAL, 2, 2)

while True:
    time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

问题在哪里?

小智 15

从我的系统的man setitimer(强调我的):

系统为每个进程提供三个间隔计时器,每个计时器在不同的时域中递减.当任何计时器到期时,会向进程发送一个信号,并且计时器(可能)重新启动.

ITIMER_REAL 实时递减,并在到期时提供SIGALRM.

ITIMER_VIRTUAL 仅在进程执行时递减,并在到期时发送SIGVTALRM.

您是否只是想念您的过程在睡觉时没有执行?你需要花费很长时间才能在这个循环中累积实际使用的时间.