0

現在、かなり複雑なマルチスレッド Python スクリプトに取り組んでいます。一度に約 5 つのスレッドで実行されるメイン関数が 1 つあります。ハングアップし、実行中のプロセッサ コアを 100% 使用しているという問題が発生しています。このハングは、メイン関数が何百回も実行された後に発生するため、いつどこで発生しているのかを正確に特定することは困難です。プログラムがハングすると、再び実行されることはありません。

一度にハングするスレッドは 1 つだけのようで、プログラム全体がハングする理由がよくわかりませんでした。その時、このスタック オーバーフロー ソリューションを見つけました。「一部の Python 実装では、一度に実行できる Python スレッドは 1 つだけです。CPython のスレッドは、CPU を集中的に使用するタスクをバックグラウンドで実行するのではなく、IO 操作を多重化する場合にのみ役立ちます。 " そのため、1 つのスレッドが CPU をフルに使用してハングすると、プログラム全体が停止するのは当然です。

以下は、プログラムがハングしたときの python.exe プロセスの Process Explorer のビューのスクリーンショットです。ご覧のとおり、実際に何かを実行しているスレッドは 1 つだけです。

プロセス マネージャーのスクリーンショット

スクリプトがハングする前に実行された行を正確に分析できるようにしたいと考えています。"import pdb; pdb.set_trace()" を使用してどこにブレークポイントを挿入できるかはよくわかりません。いつ、どこで失敗するかわからないからです。ハングするのに 30 分から数時間かかるため、プログラムを手動で実行することはできません。スクリプトを調べて、結果として生じる可能性のある明白な無限ループなどを見つけようとしましたが、ハングの原因を突き止められないようです。

私の質問はこれです:これをデバッグするにはどうすればよいですか? 理想的には、ハングする直前にどの行が実行されたかを確認したいのですが、いつハングしたかを検出する方法さえ知りません。ここに完全なスクリプトを投稿することはできないので、誰かがこれをデバッグする方法を知っていることを願っています. 前もって感謝します。

4

2 に答える 2

1

これはsrc https://softwareengineering.stackexchange.com/questions/126940/debug-multiprocessing-in-pythonに役立つかもしれません

import multiprocessing, logging
logger = multiprocessing.log_to_stderr()
logger.setLevel(multiprocessing.SUBDEBUG)
于 2013-06-03T21:20:59.573 に答える
0

Sys Internals の procmon を試して、プロセスがシステム コール レベルで何を行っているかを確認できます。

デバッガーを使用してアタッチして、各スレッドのバックトレースを取得することもできます。gdb が Windows でどの程度うまく機能するかはわかりませんが、これは私が過去に *ix で使用したものです。http://svn.python.org/projects/python/trunk/Misc/gdbinitのようなものを使用して、C プログラム (cpython インタープリター) にアタッチしている場合でも、Python コール スタックが表示されることがあります。

pdb は実際には gdb よりも優れた選択肢かもしれませんが、これには pdb を使用していません。

于 2013-06-03T22:56:27.410 に答える