2012-03-20 16 views
7

Mam swój główny wątek aplikacji, który spawnuje 2 wątki i łapię SIGINT w moim głównym wątku, aby je ładnie zamknąć. Na Linuksie używam signal.pause() i działa idealnie.Python: signal.pause() odpowiednik w systemie Windows

Jaki jest najlepszy sposób wdrożenia signal.pause() w systemie Windows?

Moje rozwiązanie jest brzydki:

my_queue.get(True, averylongtime) 

I umieścić coś w my_queue w moim obsługi sygnału. Zwróć uwagę, że jeśli nie określę limitu czasu, SIGINT nie zostanie przechwycony. Ale zastanawiam się, czy istnieje lepsze rozwiązanie.

Dziękuję

+0

W jaki sposób generujesz SIGINT? Jeśli jest to tylko + C z klawiatury, możesz wpaść w klawiaturę KeyboardInterrupt. W przeciwnym razie może to być przypadek podniesienia zdarzenia Win32. – cdarke

Odpowiedz

0

Używam tego:

#another: 
while not self.quit: 
    # your code 

# main 
try: 
    # your code 
except KeyboardInterrupt: 
    another.quit = True 
    time.sleep(5) # or wait for threading.enumerate() or similar 

Jeśli chcę go bardziej wytrzymałe, powiedzmy, zjazd w obecności robaków też:

except KeyboardInterrupt: 
    another.quit = True 
    signal.alarm(5) 
    time.sleep(6) 

Efektem ubocznym tego jest że każdy blok, w którym jesteś except: lub (który nie jest czymś, co powinieneś robić tak czy inaczej) musisz poprzedzić except KeyboardInterrupt: raise, tak aby wyjątek nie był "zjedzony" ".

+0

część odpowiedzi nie będzie działać w systemie Windows, o czym jest pytanie. signal.alarm nie jest dostępny w systemie Windows –

+0

good catch @PhilippeOmbredanne –

+0

i FWIW @qarma ... Byłbym bardzo zainteresowany czymś, co działa jak signal.alarm, ale w systemie Windows –

0

Używam tego do przechwytywania ctrl-c w oknach. W przypadku, gdy piszę do fajki lub pliku, lub co masz .. Chcę wyjść z wdziękiem. Poniżej znajduje się zabawkowy przykład:

import signal 
import sys 

def signal_handler(signal, frame):  
    print('Process Interrupted!\n\a') 
    sys.exit(0) 

signal.signal(signal.SIGINT,signal_handler) 

#Rest of your code 
Powiązane problemy