2011-12-08 17 views
6

In * nix sygnalizacja Pythona pozwala mi zatrzymać się przed snem, zanim będzie gotowy. Czy jest jakiś podobny mechanizm dostępny w oknach - wydaje się, że wszystkie metody kończą przechwytywanie kodu dopiero po zaśnięciu? PrzykłademCzy istnieje sposób, aby zatrzymać time.sleep w systemie Windows?

Kod:

from time import sleep 
.. do something that will intercept the sleep 
try: 
    sleep(60) 
finally: 
    print 'how to get here under 60 seconds in windows?' 

Podobne pytanie, które nie ma odpowiedzi dla systemu Windows: break/interrupt a time.sleep() in python

dokumentacja
+5

Czy możesz napisać swój kod, więc czeka na 'threading.Event', z czasem oczekiwania 60 sekund, i uderzyć to wydarzenie z innego wątku, jeśli chcesz anulować oczekiwanie? –

+1

najpierw przeczytaj zdanie parsujące klasyczną interpunkcję. Chciałbym móc zatrzymać czas, śpiąc gdzieś. – Simon

+0

To nie jest mój kod. Jest to nieokreślony kod klienta, który próbuję zatrzymać po wystąpieniu limitu czasu. Wygląda na to, że w cpythonie nie ma naprawdę dobrego mechanizmu ... i tak, próbowaliśmy także wątków i podprocesu, nie ma wyjścia. – mkorpela

Odpowiedz

4

Python dla signal mówi:

• Mimo Pythona obsługi sygnałów są nazywane asynchronicznie aż do użytkownika Pythona, mogą wystąpić tylko między e "atomowe" instrukcje interpretera Pythona. Oznacza to, że sygnały przychodzące podczas długich obliczeń zaimplementowanych wyłącznie w C (takie jak dopasowania regularne na dużych ciałach tekstu) mogą być opóźnione o dowolny czas w przypadku .

natomiast time mówi:

Rzeczywisty czas zawieszenie może być mniejsza niż wymagane, ponieważ każda złapać sygnał zakończy sleep() po wykonaniu łowczy procedurę, która Sygnału.

W Windows najwyraźniej time.sleep() nie jest realizowany zgodnie z dokumentacją, ponieważ obsługi dla sygnału odbieranego w czasie snu nie jest rozpatrzony aż cały okres snu jest zakończona. Poniższy przykład:

import signal, time 

def handler(signum, frame): 
    print('Signal handler called with signal', signum) 

signal.signal(signal.SIGINT, handler) 

print("signal set, sleeping") 
time.sleep(10) 
print("sleep done") 

drukuje:

signal set, sleeping 
Signal handler called with signal 2 
sleep done 

pierwszej linii występującym bezpośrednio, a pozostałe dwie po 10 sekund, niezależnie od tego, kiedy następuje przerwanie.

Zgodnie z sugestią Thomasa K, lepszą strategią byłoby używanie wątków i synchronizacja.

1

Nie jestem pewien, czy to zrobi to za Ciebie, ale tutaj jest trochę obejście można zrobić:

for i in range(60): 
    if checkIfIShouldInterruptSleep(): 
     break 
    time.sleep(1) 
print "Finished Sleeping!" 

To dokładna tylko do drugiego, ale może służyć swój cel. Szczęśliwe kodowanie!

Powiązane problemy