2009-03-13 19 views
13

Tengo una función que de vez en cuando cuelga. Normalmente, pondría una alarma, pero estoy en Windows y no está disponible. ¿Hay una manera simple de evitar esto, o debería simplemente crear un hilo que llame a time.sleep()?signal.alarm replacement en Windows [Python]


Terminó yendo con un hilo. Único truco estaba usando os._exit en lugar de sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far 
+2

Podría, por favor retire la respuesta de su pregunta * * y que lo ponga como un real ... * * respuesta? – ThiefMaster

+1

usted podría [usar 'threading.Timer()' en su lugar] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ThiefMaster hecho! – LondonRob

Respuesta

2

Usted podría - como usted ha mencionado - sólo poner en marcha un nuevo hilo que tiene capacidad para ese número de segundos.

O puede usar uno de los temporizadores multimedia de Windows (en Python, que estarían en windll.winmm). Creo que timeSetEvent es lo que estás buscando. A propósito, encontré un fragmento de código que lo usa here.

3

La solución más robusta es usar un subproceso y luego eliminar ese subproceso. Python2.6 agrega .kill() a subprocess.Popen().

No creo que su enfoque de enhebrado funcione como espera. Eliminar su referencia al objeto Thread no matará el hilo. En cambio, necesitaría establecer un atributo que el hilo verifique una vez que se despierta.

+0

¿Puedes aclarar cómo usar '.kill()' para manejar una función de suspensión después de un cierto período de tiempo? –

+0

Rhamphoryncus: Creo que su punto acerca de eliminar el trabajo de referencia de hilo o no es algo discutible en este caso. Lo último que hace el método 'run()' de la subclase 'threading.Thread' es call' os._exit() ', e incluso si no lo hiciera, el método terminaría y efectivamente se" mataría ". En el peor de los 'del alarm's son innecesarios. – martineau

3

Así es como el cartel original resolvió su propio problema:

terminó yendo con un hilo. Único truco estaba usando os._exit en lugar de sys.exit

import os 
import time 
import threading 

class Alarm (threading.Thread): 
    def __init__ (self, timeout): 
     threading.Thread.__init__ (self) 
     self.timeout = timeout 
     self.setDaemon (True) 
    def run (self): 
     time.sleep (self.timeout) 
     os._exit (1) 

alarm = Alarm (4) 
alarm.start() 
time.sleep (2) 
del alarm 
print 'yup' 

alarm = Alarm (4) 
alarm.start() 
time.sleep (8) 
del alarm 
print 'nope' # we don't make it this far