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)
问题出在哪里?
答案 0 :(得分:15)
从我的系统的man setitimer(强调我的):
系统为每个进程提供三个间隔计时器,每个计时器在不同的时域中递减。当任何计时器到期时,信号将被发送到进程,并且计时器(可能)重新启动。
ITIMER_REAL 实时递减,并在到期时发送SIGALRM。
ITIMER_VIRTUAL 仅在流程执行时递减,并在到期时提供SIGVTALRM。
你是否只是想念你的过程在睡觉时没有执行?你需要花费很长时间才能累积实际使用的时间。
答案 1 :(得分:4)
signal.ITIMER_VIRTUAL
仅在进程正在运行时倒计时。 time.sleep(5)
暂停进程,以便计时器不会减少。