Najpierw, konfigurując moduły obsługi sygnałów za pomocą modułu signal
, należy je utworzyć w głównym wątku. Otrzymasz wyjątek, jeśli spróbujesz utworzyć je w osobnym wątku.
Procedury obsługi rejestru zarejestrowane za pomocą funkcji signal.signal()
będą zawsze wywoływane w głównym wątku. Na architekturach obsługujących wysyłanie sygnałów do wątków, na poziomie C uważam, że środowisko wykonawcze Python ignoruje wszystkie sygnały na wątkach i ma procedurę obsługi sygnału w głównym wątku, której używa do wysyłania do obsługi sygnału w kodzie Python.
Dokumentacja modułu thread
stwierdza, że KeyboardInterrupt
wyjątek (który jest zwykle wywołane przez SIGINT
) może być delivered to an arbitrary thread chyba że masz moduł dostępne dla Ciebie signal
, którego wszystkie systemy Unix powinni mieć. W takim przypadku jest dostarczany do głównego wątku. Jeśli jesteś w systemie bez signal
, będziesz musiał złapać KeyboardInterrupt
w swoim wątku i zadzwonić pod numer thread.interrupt_main()
, aby ponownie go podnieść w głównym wątku.
Więcej informacji można znaleźć w dokumentacji Pythona dla modułów thread
i signal
.
Interesujące, myślałem, że tylko główny wątek otrzyma 'KeyboardInterrupt's. –
Tak! Kto wie, dlaczego tak nie jest. –
Z mojego doświadczenia wynika, że po przeczytaniu dokumentacji, gdy dostępny jest moduł 'signal',' KeyboardInterrupt' jest dostarczany tylko do głównego wątku. – Miles