2010-02-18 100 views
8

嗯,至少對我來說是個謎。考慮以下內容:蟒蛇計時器神祕

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

你有沒有試過把第二個程序中的'time.sleep(5)'改成'pass'? – Gabe 2010-02-18 20:52:56

回答

14

從我的系統中的男人setitimer(重點煤礦):

該系統提供三種間隔計時器每一個過程,在不同的時域每個遞減。當任何計時器到期時,信號被髮送到進程,並且計時器(潛在地)重新啓動。

ITIMER_REAL 實時遞減,並在到期時遞送SIGALRM。

ITIMER_VIRTUAL 僅在進程執行時遞減,並且在到期時遞送SIGVTALRM。

你是否錯過了你的程序在睡眠時沒有執行?您需要花費很長時間才能在該循環中累積實際使用的時間。

+0

這對我來說是一個很好的解釋。當你執行'time.sleep()'時,你的進程被掛起(即不執行)。如果您將其更改爲「傳遞」,您的流程將執行並消耗時間。 – Gabe 2010-02-18 20:51:53

+0

我多麼愚蠢!以上只是一個快速測試,看看定時器信號如何工作...新手(在信號)錯誤。謝謝!! – jldupont 2010-02-18 20:53:29

3

signal.ITIMER_VIRTUAL只有在進程運行時才倒計時。 time.sleep(5)暫停進程,所以定時器不會遞減。

+0

+1:謝謝.......... – jldupont 2010-02-18 20:54:44