2009-07-27 18 views

Odpowiedz

9

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.

+0

Interesujące, myślałem, że tylko główny wątek otrzyma 'KeyboardInterrupt's. –

+0

Tak! Kto wie, dlaczego tak nie jest. –

+1

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

4

Z dokumentacji signal:

Niektóre należy zachować ostrożność, jeśli oba sygnały i nici stosowane są w tym samym programie. Podstawową rzeczą do zapamiętania przy jednoczesnym użyciu sygnałów i wątków jest: zawsze wykonywać operacje signal() w głównym wątku wykonywania. Dowolny wątek może wykonywać kodowanie ,,lub inne; tylko główny wątek może ustawić nową procedurę obsługi sygnału, a główny wątek będzie jedynym, który odbierze sygnały (jest to egzekwowane przez moduł sygnału Pythona, nawet jeśli implementacja wątku bazowego obsługuje wysyłanie sygnałów do poszczególnych wątków). Oznacza to, że sygnałów nie można używać jako środka komunikacji między wątkami. Zamiast tego użyj zamków.

Powiązane problemy