2009-07-30 11 views
8

Dzisiaj uciekłem przed faktem, że sys.exit() wywołane z wątku potomnego nie zabija głównego procesu. Nie wiedziałem o tym wcześniej i jest to w porządku, ale potrzebowałem dużo czasu, aby to zrozumieć. Zaoszczędziłoby to przez wiele czasu, gdyby sys.exit(msg) wydrukowałoby msg na stderr. Ale tak się nie stało.Python: Dlaczego `sys.exit (msg)` wywołane z wątku nie drukuje `msg` na stderr?

Okazało się, że nie był to prawdziwy błąd w mojej aplikacji; nazwano sys.exit(msg) z znaczącym błędem w sposób wolicjonalny - ale po prostu nie mogłem tego zobaczyć.

In the docs for sys.exit() it is stated: „[...] każdy inny obiekt jest drukowany na sys.stderr i wyników w kodzie wyjścia 1”

To nieprawda na wezwanie od dziecka gwintem, gdzie sys.exit() oczywiście działa jak thread.exit(): „podnoszenie wyjątek SystemExit Gdy nie jest złapany, spowoduje to nić wyjść cicho”.

Myślę, że gdy programista chce, aby sys.exit(msg) wydrukował komunikat o błędzie, powinien on zostać wydrukowany - niezależnie od miejsca, z którego jest wywoływany. Dlaczego nie? Obecnie nie widzę żadnego powodu. Przynajmniej w dokumentach powinno być wskazówka, że ​​wiadomość nie jest drukowana z wątków.

Co myślisz? Dlaczego komunikaty o błędach są ukryte przed wątkami? Czy to ma sens?

poważaniem,

Jan-Philip Gehrcke

Odpowiedz

6

Zgadzam się, że dokumenty Pythona są niepoprawne, a może bardziej niekompletne, dotyczące sys.exit i SystemExit, gdy są wywoływane/wywoływane przez wątki inne niż główne; proszę otworzyć problem z dokumentacją na śledzeniu online Pythona, aby można było zająć się tą kwestią w przyszłej iteracji dokumentów (prawdopodobnie w niedalekiej przyszłości - poprawki do dokumentu są łatwiejsze i bardziej płynne niż poprawki kodu ;-).

Lekarstwem jest całkiem proste, oczywiście - wystarczy owinąć każdą funkcję, której używasz jako cel o threading.Thread z dekorator, dokłada się try/except SystemExit, e: wokół niego i wykonuje „pisać na stderr” dodatkową funkcjonalność potrzebujesz (lub, być może, lepiej, używa wywołania logging.error) przed zakończeniem. Ale z problemem doktora, który prawidłowo wskazujesz, ciężko jest o tym myśleć, dopóki nie spotkasz się z problemem i faktycznie musiałeś poświęcić trochę czasu na debugowanie, aby go sparować, tak jak musiałeś do (w zbiorowym imieniu głównych deweloperów Pythona - przepraszam!).

+0

Dałeś mi dobrą radę, znowu;) Przy okazji: To takie wspaniałe, że dzielisz się swoją wiedzą tutaj. Widzę, że obecnie poświęcasz dużo swojego czasu, aby wypełnić tę platformę czystym ekspertem w Pythonie!To jest to, czego potrzebuje społeczność, ale to nie jest kwestia oczywiście. Bardzo, bardzo dziękuję za to! Jan-Philip –

+0

@ Jan-Philip, jesteś bardzo mile widziany, i, dzięki WAM za to, zawsze miło jest słyszeć, że jestem z pomocą! –

0

Nie wszystkie wątki w Pythonie są równe. Wywołanie sys.exit z wątku nie powoduje wyjścia z systemu. Dlatego wywołanie sys.exit() z wątku podrzędnego jest bezsensowne, więc ma sens, że nie zachowuje się tak, jak się spodziewasz.

Ten artykuł zawiera informacje na temat gwintowania obiektów i różnic między wątkami a specjalnym wątkiem "głównym".

Powiązane problemy