2009-03-13 6 views
13

J'ai une fonction qui se bloque parfois. Normalement, je voudrais définir une alarme, mais je suis dans Windows et il n'est pas disponible. Y at-il un moyen simple autour de ceci, ou devrais-je simplement créer un thread qui appelle time.sleep()?remplacement de signal.alarm dans Windows [Python]


Terminé par un thread. Seul truc utilisait os._exit au lieu 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

Pourriez-vous s'il vous plaît supprimer la réponse de votre question * * et l'afficher comme ... réelle * réponse *? – ThiefMaster

+1

vous pourriez [utiliser 'threading.Timer()' à la place] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ThiefMaster done! – LondonRob

Répondre

2

Vous pourriez - comme vous l'avez dit - il suffit de lancer un nouveau thread qui dort pour ce nombre de secondes.

Ou vous pouvez utiliser l'un des minuteurs multimédia de Windows (en Python, ce serait dans windll.winmm). Je crois que timeSetEvent est ce que vous cherchez. Incidemment, j'ai trouvé un morceau de code qui l'utilise here.

3

La solution la plus robuste consiste à utiliser un sous-processus, puis de supprimer ce sous-processus. Python2.6 ajoute .kill() à subprocess.Popen().

Je ne pense pas que votre approche de thread fonctionne comme prévu. Supprimer votre référence à l'objet Thread ne supprimera pas le thread. Au lieu de cela, vous devez définir un attribut que le thread vérifie dès qu'il se réveille.

+0

pouvez-vous clarifier comment utiliser '.kill()' pour traiter une fonction de suspension après un certain laps de temps? –

+0

Rhamphoryncus: Je pense que votre point sur la suppression de la référence de fil de travail ou non est un peu théorique dans ce cas. La dernière chose que fait la méthode 'run()' de la sous-classe 'threading.Thread' est d'appeler' os._exit() ', et même si ce n'est pas le cas, la méthode se terminera et deviendra effectivement" tuée ". Au pire, les «del alarmes» sont inutiles. – martineau

3

Voilà comment l'affiche originale a résolu son problème:

a fini par aller avec un fil. Seul truc utilisait os._exit au lieu 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 
Questions connexes