簡単に
multiprocessing
モジュール A の関数がインポート可能であると想定されている場合、標準ライブラリ パッケージでモジュール A の関数を実行できるようにするには、どうすればモジュール B からモジュール A にパッチを当てることができますか?
バックグラウンド
クライアントは、他のクライアントには適用できないホットフィックスを要求したので、新しいブランチを作成し、マスター ブランチからの変更を簡単にマージできるようにするためだけに別のモジュールを作成しました。クライアントのホットフィックス前の動作との下位互換性を維持するために、アプリで構成可能な設定としてホットフィックスを実装しました。したがって、古いコードを置き換えたくありませんでした。設定がオンになったときにパッチを当てるだけです。これはモンキーパッチで行いました。
コード構造
モジュールは__main__
構成ファイルを読み取ります。構成がホットフィックスのスイッチをオンにすると、いくつかの関数をモジュールで定義されたコードに置き換えることでモジュールに__main__
パッチを適用します。本質的に、置き換えられる関数は最大化関数の重要な関数です。モジュールは後でワーカーのプールをロードします。engine
hotfix
engine
multiprocessing
問題
multiprocessing
ワーカーが開始されると、最初にモジュールを再インポートmultiprocessing
し、置き換えようとしたキー関数を探します(その後、コードに制御を渡し、最大化アルゴリズムが開始されます)。はまったく新しいプロセスによって再インポートされており、無限ループが発生するため、新しいプロセスは (構成ファイルが読み取られる場所で) 再実行されないため、 re-monkey-patch を認識しません。engine
__main__
multiprocessing
engine
__main__
engine
質問
コードのモジュール性を維持し (つまり、ホットフィックス コードを別のモジュールに保持する)、Python のmultiprocessing
パッケージを利用するにはどうすればよいですか?
* 私のコードは Windows (私のクライアント用) と Unix (私の正気のため...) で動作する必要があることに注意してください。