2010-02-18 15 views
8

Beh, almeno un mistero per me. Considera quanto segue:python timer mystery

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) 

Funziona come previsto, consegna un "beat!" messaggio ogni 2 secondi. Successivamente, non viene prodotto alcun output:

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) 

Dov'è il problema?

+0

Hai provato a cambiare 'time.sleep (5)' nel secondo programma in 'pass'? – Gabe

risposta

14

Da del mio sistema dell'uomo setitimer (sottolineatura mia):

Il sistema fornisce ogni processo con tre timer a intervalli, ogni decrementare in un dominio distinta tempo. Quando un timer scade, viene inviato un segnale al processo e il timer (potenzialmente) viene riavviato.

ITIMER_REAL decrementi in tempo reale e consegna SIGALRM alla scadenza.

ITIMER_VIRTUAL decrementa solo quando il processo è in esecuzione e consegna SIGVTALRM alla scadenza.

Ti manca solo che il tuo processo non viene eseguito mentre dormi? Ci vorrà parecchio tempo perché tu possa maturare il tempo effettivamente usato con quel ciclo.

+0

Mi sembra una buona spiegazione. Quando esegui 'time.sleep()', il tuo processo è sospeso (cioè non in esecuzione). Se lo hai cambiato in 'pass', il tuo processo verrebbe eseguito e consumato. – Gabe

+0

Che sciocco da parte mia !!! Quanto sopra è stato solo un breve test per vedere come funzionano i segnali timer ... errore newbie (sui segnali). Grazie!! – jldupont

3

Il signal.ITIMER_VIRTUAL conta solo con il processo in esecuzione. time.sleep(5) sospende il processo in modo che il timer non diminuisca.

+0

+1: grazie .......... – jldupont