Python计时器之谜
好吧,对我来说这真是个谜。考虑以下内容:
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信号。
你是不是刚刚忽略了你的进程在睡觉的时候并没有在执行?这样的话,你在那个循环中实际使用的时间会累积得非常慢。