ホームページ >バックエンド開発 >Python チュートリアル >マルチプロセッシングは、レプリケーションなしで読み取り専用の共有データを共有できますか?

マルチプロセッシングは、レプリケーションなしで読み取り専用の共有データを共有できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-25 02:46:30254ブラウズ

Can Multiprocessing Share Read-Only Shared Data Without Replication?

マルチプロセッシングは読み取り専用の共有データをレプリケートしますか?

はじめに

マルチプロセッシングのシナリオでは、共有データが複数のプロセス間で重複しない。このような状況で読み取り専用データがどのように処理されるかを理解すると、メモリとパフォーマンスのオーバーヘッドを大幅に節約できます。

質問

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

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