2009-03-13 18 views
13

Mam funkcję, która czasami zawiesza się. Normalnie ustawiłbym alarm, ale jestem w systemie Windows i jest niedostępny. Czy istnieje prosty sposób obejścia tego, czy powinienem po prostu utworzyć wątek, który wywołuje time.sleep()?zamienna signal.alarm w systemie Windows [Python]


Skończyło się na wątku. Tylko sztuczka używał os._exit zamiast 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

mógłbyś usunąć odpowiedź z pytaniem * * i umieścić go jako odpowiedź ... rzeczywistego * *? – ThiefMaster

+1

można [użyj 'threading.Timer()' zamiast] (http://stackoverflow.com/a/28081214/4279) – jfs

+1

@ ThiefMaster zrobione! – LondonRob

Odpowiedz

2

Można by - jak wspomniano - tylko inauguracją nowego wątku, że śpi w tym liczbę sekund.

Lub możesz użyć jednego z timerów multimedialnych Windows (w Pythonie, który będzie w windll.winmm). Uważam, że to właśnie szukasz: timeSetEvent. Nawiasem mówiąc, znalazłem kawałek kodu, który używa go here.

3

Najbardziej niezawodnym rozwiązaniem jest użycie podprocesu, a następnie zabicie tego podprocesu. Python2.6 dodaje .kill() do podprocesu.Popen().

Nie sądzę, aby twoje podejście do gwintowania działało zgodnie z oczekiwaniami. Usunięcie odniesienia do obiektu Thread nie zabije wątku. Zamiast tego musisz ustawić atrybut, który wątek sprawdza po jego obudzeniu.

+0

czy możesz wyjaśnić, jak używać '.kill()' do radzenia sobie z funkcją zawieszania po pewnym czasie? –

+0

Rhamphoryncus: Myślę, że twój punkt widzenia na usuwanie odnośnika wątku działa, czy nie jest w tym przypadku nieco dyskusyjny. Ostatnią rzeczą, jaką robi metoda 'run()' z podklasy 'threading.Thread' jest wywołanie' os._exit() ', a nawet gdyby tak nie było, metoda zakończyłaby się i skutecznie" zabiłaby ". Co gorsza, "alarmy" są niepotrzebne. – martineau

3

Oto jak oryginalny plakat rozwiązać swój problem:

skończyło się z wątku. Tylko sztuczka używał os._exit zamiast 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 
Powiązane problemy