カスタム multiprocessing.Pool() を介して 15 ~ 25 のサブプロセスを生成するキュー作業デリゲータがあります。個々のワーカーは、1000 ミリ秒未満で 10 から 15 のメッセージで 1 から 3 の logging.info メッセージを発行します。タイムスタンプは常に連続しており、他のメッセージと衝突することはありません。これは、マルチプロセッシングまたはロギングのどこかに共有ロックがあることを示唆していますが、それがどこにあるのか正確にはわかりません。
問題のソフトウェアは、リアルタイムの 90% が IO にあるため、非同期またはマルチスレッドにリファクタリングされる予定であるため、これは主に教育目的で求められます (リモート API であり、数のクランチではありません)。
ロギング構成は、構成方法が気に入ったので、Django をミラーリングします。
LOGGING['handlers']['complex_console'] = {'level':'DEBUG',
'class':'logging.StreamHandler',
'formatter':'complex'
}
LOGGING['loggers']['REDACTED_sync'] = {
'handlers': ['complex_console'],
'propagate': True,
'level':'DEBUG'
}
multiprocessing.Process は fork を使用しますが、logging.getLogger() の呼び出しは、子プロセスが生成されるまで行われません。