python计时器之谜

时间:2010-02-18 20:43:06

标签: python timer signals

嗯,至少对我来说是一个谜。请考虑以下事项:

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)

按预期工作,即提供“节拍!”消息每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)

问题出在哪里?

2 个答案:

答案 0 :(得分:15)

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

  

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

     

ITIMER_REAL 实时递减,并在到期时发送SIGALRM。

     

ITIMER_VIRTUAL 仅在流程执行时递减,并在到期时提供SIGVTALRM。

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

答案 1 :(得分:4)

signal.ITIMER_VIRTUAL仅在进程正在运行时倒计时。 time.sleep(5)暂停进程,以便计时器不会减少。