3

Pythonでは、ロガーが親プロセスで構成されている場合、子プロセスもそのロガーを取得しますか?より明確にするために、私のアプリケーションでは、logger = logging.getlogger()ハンドラーを実行して追加することにより、親プロセスのルートロガーを構成します。子プロセスがフォークされたとき

logger = logging.getlogger()
logger.info("dfsdf")

次に、すべてのログが親のルートロガーに従って処理されます。子のルートロガーを構成しませんでした。どうしてそれは可能ですか?それらは2つの異なるプロセスですが、どうすれば同じロガーを持つことができますか?

4

2 に答える 2

4

プロセスをフォークすると、ロガー構成を含む親プロセスのメモリが「継承」されます。

フォークウィキペディアのページから:

fork 操作は、子用に別のアドレス空間を作成します。子プロセスは、親プロセスのすべてのメモリ セグメントの正確なコピーを保持しますが、コピー オン ライト セマンティクスが実装されている場合、実際の物理メモリは割り当てられない可能性があります (つまり、両方のプロセスがしばらくの間、同じ物理メモリ セグメントを共有する可能性があります)。 . 親プロセスと子プロセスの両方が同じコード セグメントを所有していますが、互いに独立して実行されます。

これは Python に固有のものではありません。これは、C、Perl、または Python で実装されているかどうかに関係なく、フォークされた UNIX プロセスで発生します。

multiprocessingモジュールはこれを (それをサポートするプラットフォーム上で) 使用して、新しいプロセスを迅速に起動します。

ロガーを継承すると、競合状態が発生する可能性があることに注意してください。モジュールはloggingスレッドセーフについてのみ知っています。スレッド ロックを使用してハンドラーへのアクセスをシリアル化しますが、そのロックはプロセス間で共有されません (子プロセス内のすべてはコピーであり、同じオブジェクトではありません)。

これは、親と子の両方から同時にメッセージをログに記録すると、OS がログ エントリをファイルに書き込んでいる間に 2 つのプロセス間で切り替わるため、ログ エントリが混在してしまう可能性があることを意味します。

于 2013-02-01T10:00:15.900 に答える