質問: Python multiprocessing Pool にてマルチプロセスで並列処理を作っています。 (1) Poolに渡した関数側から、メインプロセスが持つ巨大な配列(辞書)を参照したいのですが、この配列の子の中に更にリストや辞書の子を複数持つ複雑な構造になっていて、Managerはそれぞれのリストや配列全てに適用しなければならないのでしょうか? また、Managerにはlistやdictが用意されているけど、値(数値)の場合は意識する必要は無いのでしょうか? (2) メインの巨大な配列を作る時に数秒の無反応が起こる為、作成作業自体を並列化しようと思ったのですが、Managerのインスタンスを引数で渡してmanager.dict()などで作ると、 >>Pickling an AuthenticationString object is disallowed for security reasons というエラーが出てしまいます。 呼び出し先でManagerのインスタンスを作って使えばエラーは出ないのですが、Managerインスタンスを使い回す必要は無いのでしょうか? (3) マルチプロセスでの排他アクセスの必要性は分かるのですが、メモリアクセスの衝突が起こったことがないので実感が無く、モジュールを インクルードするだけのお手軽さの反面、実体がブラックボックスで動作原理がつかめず理解に繋がらない状態です。今回のような使い方の場合に別の適した方法がある場合は教えて欲しいです。 その他 巨大配列はメインプロセスが主に追記や書き換えを行い、サブプロセスは参照するだけの状況です。配列作成時はサブの方で全体を作る事になります。 具体的な全体像はpygletによりメインプロセスはウィンドウにぶら下がってイベント待機しています。反応が無くなるとウィンドウが動かせなくなったりして不便なので分離したいと思っています。 よろしくお願いします。
回答: (1)poolにより呼ばれたプロセスはメインプロセスと同じメモリのコピーを持つらしい(未検証未確認) なので、メモリアクセスに関しては共有を意識する必要は無い。 (2)サブプロセスで作ったデータはメインプロセスから戻り値として貰い受けるだけでいい (3)まだ分からないことが多いです。