Python计时器之谜

8 投票
2 回答
4497 浏览
提问于 2025-04-15 19:27

好吧,对我来说这真是个谜。考虑以下内容:

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秒会发出一个“beat!”的消息。接下来,没有任何输出:

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 个回答

4

signal.ITIMER_VIRTUAL 这个计时器只在程序运行的时候才会倒计时。当你使用 time.sleep(5) 暂停程序时,计时器就不会减少了。

16

根据我系统的手册关于setitimer的内容(我强调的部分):

系统为每个进程提供了三个定时器,每个定时器在不同的时间范围内倒计时。当任何一个定时器到期时,会向进程发送一个信号,并且这个定时器(可能)会重新开始计时。

ITIMER_REAL 在真实时间中倒计时,到期时会发送SIGALRM信号。

ITIMER_VIRTUAL 只有在进程正在执行时才会倒计时,到期时会发送SIGVTALRM信号。

你是不是刚刚忽略了你的进程在睡觉的时候并没有在执行?这样的话,你在那个循环中实际使用的时间会累积得非常慢。

撰写回答