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.
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? –
najpierw przeczytaj zdanie parsujące klasyczną interpunkcję. Chciałbym móc zatrzymać czas, śpiąc gdzieś. – Simon
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