7

このモジュールを使用してlogging、アプリケーション サーバーからのメッセージをログに記録しています。より具体的には、StreamHandler を使用してメッセージを stdout/stderrSupervisordに記録し、それらのメッセージをファイルに記録するために使用します (サーバー プロセスは によって監視されているためSupervisord)。

私の主な質問は、ログ ファイル内のメッセージの順序は、常にコードの実行順序を正しく反映しているのかということです。たとえば、メッセージがログ ファイル内のA: this is log msg Aメッセージの前に表示される場合、メッセージをログに記録するコード行がメッセージをログに記録するコード行の前に実行されたB: this is log msg Bことを 100% 確信できます。ログファイルは同じですか?AB

4

1 に答える 1

4

100% 確信は持てませんが、かなり確信しています。

logging.warning("A")ロギングモジュールは出力ファイルに書き込む前にロックしますが、複数のスレッドまたはプロセスを実行している場合、他のいくつかのスレッドがほぼ同じ時間に同じことをしようとしている場合、呼び出したコードまたは何かが実際にロックを取得するという保証はありません時間。

ロギングのドキュメントとそのソースも参照してください。を使用していることがわかりますthreading.RLock。これについて、ドキュメントには次のように書かれています。

ロックが解除されるまで待機している複数のスレッドがブロックされている場合、一度に 1 つのスレッドだけがロックの所有権を取得できます。この場合、戻り値はありません。

どのスレッドが最初にロックを取得するかを完全に特定することはできません。これが問題です。

于 2013-05-09T03:44:20.620 に答える