マルチプロセッシング: 読み取り専用データへの共有アクセスの確保
マルチプロセッシングのシナリオでは、プロセス間のデータ共有の問題が頻繁に発生します。特に、大規模な読み取り専用データ構造を扱う場合、このデータを各プロセスにコピーすることは避けることが望ましく、これは時間もメモリも大量に消費する可能性があります。
次のコード スニペットを検討してください。
<code class="python">glbl_array = # a 3 Gb array def my_func( args, def_param = glbl_array): #do stuff on args and def_param if __name__ == '__main__': pool = Pool(processes=4) pool.map(my_func, range(1000))</code>
この例では、グローバル変数 glbl_array が大きな (3 Gb) 配列として定義されています。 my_func 関数は、glbl_array で動作するように設計されています。 Pool(processes=4) を使用して複数のプロセスが並列実行用に生成される場合、各プロセスは glbl_array 内のデータの個別のコピーを受け取るのでしょうか、それともすべてのプロセスが同じ読み取り専用データを共有するのでしょうか?
Linux では、マルチプロセッシングを支える fork システム コールのセマンティクスにより、コピー オン ライト セマンティクスが有効になります。これは、glbl_array が読み取り専用の場合、必要な場合を除き、データはプロセス間で物理的にコピーされないことを意味します。
ただし、glbl_array が変更されると、1 つのプロセスによって行われた変更は、他のすべてのプロセスがアクセスできるデータに反映されます。プロセス。不要なデータの上書きを防ぐには、glbl_array の tostring() 表現などの不変オブジェクトを関数のデフォルト パラメーターとして利用することを検討してください。
あるいは、Python マルチプロセッシング モジュールが提供する共有メモリ機能を利用することもできます。共有メモリセグメントを明示的に作成して管理することで、プロセス間でデータが重複しないようにします。
以上がマルチプロセッシングで読み取り専用データへの共有アクセスを確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。