2010-02-18 18 views
8

Bueno, al menos un misterio para mí. Considere lo siguiente: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) 

Funciona como se esperaba, es decir, ofrece un "ritmo!" mensaje cada 2 segundos. A continuación, no se produce ninguna salida:

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) 

¿Dónde está el problema?

+0

¿Ha intentado cambiar 'time.sleep (5)' en el segundo programa para 'pasar'? – Gabe

Respuesta

14

De hombre setitimer de mi sistema (el énfasis es mío):

El sistema proporciona a cada proceso con tres temporizadores, los cuales se decrementan en distintas escalas de tiempo . Cuando expira un temporizador, se envía una señal al proceso y el temporizador (potencialmente) se reinicia.

ITIMER_REAL disminuye en tiempo real, y entrega SIGALRM al vencimiento.

ITIMER_VIRTUAL disminuye solo cuando el proceso se está ejecutando, y entrega SIGVTALRM al vencimiento.

¿Echas de menos que tu proceso no se está ejecutando mientras duermes? Le tomará mucho tiempo acumular el tiempo realmente utilizado con ese ciclo.

+0

Parece una buena explicación para mí. Cuando hace 'time.sleep()', su proceso se suspende (es decir, no se ejecuta). Si lo cambió a 'pass', su proceso se ejecutará y consumirá tiempo. – Gabe

+0

¡Qué tonto de mi parte! Lo anterior fue solo una prueba rápida para ver cómo funcionan las señales del temporizador ... error de novato (en las señales). ¡¡Gracias!! – jldupont

3

El signal.ITIMER_VIRTUAL solo cuenta regresivamente con el proceso en ejecución. time.sleep(5) suspende el proceso, por lo que el temporizador no disminuye.

+0

+1: gracias .......... – jldupont