ホームページ  >  記事  >  バックエンド開発  >  マルチプロセッシングで読み取り専用データへの共有アクセスを確保するにはどうすればよいですか?

マルチプロセッシングで読み取り専用データへの共有アクセスを確保するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-25 03:02:02687ブラウズ

How to Ensure Shared Access to Read-Only Data in Multiprocessing?

マルチプロセッシング: 読み取り専用データへの共有アクセスの確保

マルチプロセッシングのシナリオでは、プロセス間のデータ共有の問題が頻繁に発生します。特に、大規模な読み取り専用データ構造を扱う場合、このデータを各プロセスにコピーすることは避けることが望ましく、これは時間もメモリも大量に消費する可能性があります。

次のコード スニペットを検討してください。

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。