プロセスをフォークすると、ロガー構成を含む親プロセスのメモリが「継承」されます。
フォークウィキペディアのページから:
fork 操作は、子用に別のアドレス空間を作成します。子プロセスは、親プロセスのすべてのメモリ セグメントの正確なコピーを保持しますが、コピー オン ライト セマンティクスが実装されている場合、実際の物理メモリは割り当てられない可能性があります (つまり、両方のプロセスがしばらくの間、同じ物理メモリ セグメントを共有する可能性があります)。 . 親プロセスと子プロセスの両方が同じコード セグメントを所有していますが、互いに独立して実行されます。
これは Python に固有のものではありません。これは、C、Perl、または Python で実装されているかどうかに関係なく、フォークされた UNIX プロセスで発生します。
multiprocessing
モジュールはこれを (それをサポートするプラットフォーム上で) 使用して、新しいプロセスを迅速に起動します。
ロガーを継承すると、競合状態が発生する可能性があることに注意してください。モジュールはlogging
スレッドセーフについてのみ知っています。スレッド ロックを使用してハンドラーへのアクセスをシリアル化しますが、そのロックはプロセス間で共有されません (子プロセス内のすべてはコピーであり、同じオブジェクトではありません)。
これは、親と子の両方から同時にメッセージをログに記録すると、OS がログ エントリをファイルに書き込んでいる間に 2 つのプロセス間で切り替わるため、ログ エントリが混在してしまう可能性があることを意味します。