8

簡単に

multiprocessingモジュール A の関数がインポート可能であると想定されている場合、標準ライブラリ パッケージでモジュール A の関数を実行できるようにするには、どうすればモジュール B からモジュール A にパッチを当てることができますか?

バックグラウンド

クライアントは、他のクライアントには適用できないホットフィックスを要求したので、新しいブランチを作成し、マスター ブランチからの変更を簡単にマージできるようにするためだけに別のモジュールを作成しました。クライアントのホットフィックス前の動作との下位互換性を維持するために、アプリで構成可能な設定としてホットフィックスを実装しました。したがって、古いコードを置き換えたくありませんでした。設定がオンになったときにパッチを当てるだけです。これはモンキーパッチで行いました。

コード構造

モジュールは__main__構成ファイルを読み取ります。構成がホットフィックスのスイッチをオンにすると、いくつかの関数をモジュールで定義されたコードに置き換えることでモジュールに__main__パッチを適用します。本質的に、置き換えられる関数は最大化関数の重要な関数です。モジュールは後でワーカーのプールをロードします。enginehotfixenginemultiprocessing

問題

multiprocessingワーカーが開始されると、最初にモジュールを再インポートmultiprocessingし、置き換えようとしたキー関数を探します(その後、コードに制御を渡し、最大化アルゴリズムが開始されます)。はまったく新しいプロセスによって再インポートされており、無限ループが発生するため、新しいプロセスは (構成ファイルが読み取られる場所で) 再実行されないため、 re-monkey-patch を認識しません。engine__main__multiprocessingengine__main__engine

質問

コードのモジュール性を維持し (つまり、ホットフィックス コードを別のモジュールに保持する)、Python のmultiprocessingパッケージを利用するにはどうすればよいですか?

* 私のコードは Windows (私のクライアント用) と Unix (私の正気のため...) で動作する必要があることに注意してください。

4

3 に答える 3

1

これは、モンキー パッチが機能しない場所のように思えます。問題の関数を別のモジュールに抽出し、そこからエンジンにインポートさせる方が簡単です。おそらく、それらをどこからインポートするかの構成設定を行うことができます。

これをモジュール化する別の方法は、 ZCAのようなある種のコンポーネント アーキテクチャを使用することです。最後のオプションは私が使用するものですが、それは私がそれに慣れているためであり、余分な学習はありません.

于 2012-09-15T06:12:25.193 に答える
1

を持つ UNIX/Linux OS で動作させるにはfork()、新しいプロセスが親と同じ (モンキー パッチが適用された) クラスにアクセスできるため、特別なことをする必要はありません。

Windows で動作させるには、__main__モジュールにインポート時に構成を読み取らせます ( read_config/patch_engine呼び出しをグローバル スコープに置きます) が、マルチプロセッシング (エンジンの実行) はif __name__ == '__main__'ガード内で行います。

__main__次に、 (コマンド ラインまたは再インポートのいずれかから) がインポートされるたびに read-config コードが実行されますmultiprocessingが、if __name__ == '__main__'コードが実行されるのは、スクリプトがコマンド ラインから呼び出された場合のみです (__main__が別の名前で再インポートされるため)。子プロセス)。

于 2012-09-17T18:51:55.137 に答える
0

構成ファイルを確認するために変更engine.pyし、必要に応じて自分自身にパッチを適用する必要があるようです。

UNIX と Windows の両方で作業するにはengine、グローバルCONFIG_DONE変数を保持して、構成ファイルを再度確認する必要があるかどうかを判断できます。

于 2012-09-14T22:04:46.503 に答える