9

sys.exit()今日、私は子スレッドから呼び出されてもメインプロセスを強制終了しないという事実に反対しました。これまで知らなかったし、大丈夫ですが、気付くまでに長い時間がかかりました。に印刷したとしたら、かなりの時間を節約できたでしょう。しかし、そうではありませんでした。sys.exit(msg)msgstderr

それは私のアプリケーションの本当のバグではないことが判明しました。それsys.exit(msg)は意欲的な方法で意味のあるエラーで呼び出されました-しかし私はこれを見ることができませんでした。

そのためのドキュメントにsys.exit()「[...]他のオブジェクトが出力されsys.stderr、終了コードが1になる」と記載されています。

これは、明らかに次 のように動作する子スレッドからの呼び出しには当てはまりません。「SystemExit例外を発生させます。キャッチされない場合、スレッドはサイレントに終了します。 」sys.exit()thread.exit()

sys.exit(msg)プログラマーがエラーメッセージを出力したい場合は、呼び出された場所に関係なく、これを出力するだけでよいと思います。なぜだめですか?現在、理由はわかりません。少なくともsys.exit()、メッセージがスレッドから出力されないというヒントがドキュメントにあるはずです。

どう思いますか?エラーメッセージがスレッドから隠されているのはなぜですか?これは意味がありますか?

よろしくお願いします、

Jan-Philip Gehrcke

4

2 に答える 2

7

メインスレッド以外のスレッドによって呼び出された/発生した場合の sys.exit および SystemExit に関して、Python ドキュメントが正しくないか、より正確には不完全であることに同意します。Python オンライン トラッカーでドキュメントの問題を開いてください。そうすれば、ドキュメントの今後の繰り返しで対処できるようになります (おそらく近い将来のバージョンです -- ドキュメントの修正は、コードの修正よりも簡単でスムーズです;-)。

もちろん、解決策は非常に簡単です。/を実行threading.Threadするデコレーターでa のターゲットとして使用している関数をラップし、必要な「stderr への書き込み」追加機能を実行するだけです (または、より良いかもしれません)。 、代わりに logging.error 呼び出しを使用します) 終了する前に。しかし、あなたが正しく指摘したドキュメントの問題では、問題に遭遇し、実際に問題を突き止めるためにデバッグに時間を費やさなければならなかった場合を除き、それを行うことについて考えるのは難しいです.してください (コアの Python 開発者を代表して -- 申し訳ありません!)。tryexcept SystemExit, e:

于 2009-07-30T21:03:33.657 に答える
0

Pythonのすべてのスレッドが等しいわけではありません。スレッドからsys.exitを呼び出しても、実際にはシステムを終了しません。したがって、子スレッドからsys.exit()を呼び出すことは無意味であるため、期待どおりに動作しないことは理にかなっています。

このページでは、スレッドオブジェクト、およびスレッドと特別な「メイン」スレッドの違いについて詳しく説明します。

于 2009-07-30T20:38:22.070 に答える