temporizador de python misterio

Bueno, al menos un misterio para mí. Considera lo siguiente:

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 espera, 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?

Del setitimer del hombre de mi sistema (énfasis mío):

El sistema proporciona cada proceso con tres temporizadores de intervalo, cada uno disminuyendo en un dominio de tiempo distinto . Cuando un temporizador expira, 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.

¿Acabas de perder que tu proceso no se ejecuta mientras duermes? Le llevará mucho tiempo acumular tiempo realmente usado con ese ciclo.

La signal.ITIMER_VIRTUAL solo cuenta hacia atrás con el proceso en ejecución. time.sleep(5) suspende el proceso para que el temporizador no disminuya.