ホームページ >バックエンド開発 >Python チュートリアル >マルチプロセッシングは、レプリケーションなしで読み取り専用の共有データを共有できますか?
マルチプロセッシングのシナリオでは、共有データが複数のプロセス間で重複しない。このような状況で読み取り専用データがどのように処理されるかを理解すると、メモリとパフォーマンスのオーバーヘッドを大幅に節約できます。
次の Python コードを考えてみましょう:
<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 を共有することを推奨しますか?
重複のない共有アクセスを確保するには、Python のマルチプロセッシング モジュールによって提供される共有メモリ メカニズムを利用できます。実装方法は次のとおりです。
<code class="python">import multiprocessing import ctypes import numpy as np shared_array_base = multiprocessing.Array(ctypes.c_double, 10 * 10) shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) shared_array = shared_array.reshape(10, 10) # Parallel processing def my_func(i, def_param=shared_array): shared_array[i, :] = i if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) pool.map(my_func, range(10)) print(shared_array)</code>
コードは、multiprocessing.Array クラスを使用して共有メモリ配列 (shared_array_base) を作成します。次に、操作を容易にするために、それを Numpy 配列 (shared_array) に変換します。
メイン関数 (my_func) は、不必要なコピーを避けるために、shared_array をデフォルトのパラメーターとして受け取ります。また、Linux のコピーオンライト セマンティクスにより、データの重複が保証されます。これは、共有領域に変更が加えられた場合にのみ発生します。
コードを実行すると、共有されたshared_arrayが重複せずに出力され、プロセスが同じメモリ オブジェクトを共有していることがわかります。
以上がマルチプロセッシングは、レプリケーションなしで読み取り専用の共有データを共有できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。