señal.alarm no disparando excepción a tiempo

He modificado ligeramente el ejemplo de señal de los documentos oficiales (parte inferior de la página).

Llamo a sleep 10 pero me gustaría que se activara una alarma después de 1 segundo. Cuando ejecuto el siguiente fragmento de código, se tarda más de 1 segundo en activar la excepción (creo que se ejecuta en los 10 segundos completos).

 import signal, os def handler(signum, frame): print 'Interrupted', signum raise IOError("Should after 1 second") signal.signal(signal.SIGALRM, handler) signal.alarm(1) os.system('sleep 10') signal.alarm(0) 

¿Cómo puedo asegurarme de terminar una función después de un tiempo de espera en una aplicación de un solo hilo?

De los documentos :

Un manejador de señales Python no se ejecuta dentro del manejador de señales de bajo nivel (C). En su lugar, el controlador de señales de bajo nivel establece un indicador que le indica a la máquina virtual que ejecute el controlador de señales Python correspondiente en un punto posterior (por ejemplo, en la siguiente instrucción de código de bytes).

Por lo tanto, una señal como la generada por signal.alarm() no puede terminar una función después de un tiempo de espera en algunos casos. O la función debe cooperar permitiendo que se ejecute otro código de Python (por ejemplo, llamando a PyErr_CheckSignals() periódicamente en el código C) o debe usar un proceso separado para terminar la función a tiempo .

Su caso se puede arreglar si usa subprocess.check_call('sleep 10'.split()) lugar de os.system('sleep 10') .