ホームページ >バックエンド開発 >Python チュートリアル >オペレーティング システムごとに同期変数の動作が異なる

オペレーティング システムごとに同期変数の動作が異なる

Barbara Streisand
Barbara Streisandオリジナル
2024-11-10 03:13:02480ブラウズ

Synchronized 变量在不同操作系统的不同行为

SEO:

  • Python 同期変数値はグローバル コンテキストでは変更されません
  • 同期された値はメインプロセスで変更されません
  • 同期された値はプロセス間で共有されません

Python のマルチプロセッシング ライブラリには、異なるプロセス間でデータを共有するために使用されるラッパー タイプである multiprocessing.sharedctypes.synchronized があり、デフォルトでは、データの一貫性を維持するためにリエントラント ロック RLock が使用されます。今回 Python を再学習する前に、私は Python 3.6 を使用していました。その時点では mp ライブラリについて表面的な知識はありましたが、さまざまなオペレーティング システムでのマルチプロセス プログラムの動作の違いや、その影響について深く検討していませんでした。

今回の勉強中に問題が発生しました。macOS システム上で Python 3.12 を使用してグローバル コンテキストで multiprocessing.sharedctypes.Value 変数を作成すると、新しいプロセスでこの変数にアクセスすると、その値の同期が行われません。異なるプロセス間で維持されます。 Eric Greene 教師と話し合った結果、Python 3.8 以降、さまざまなオペレーティング システムで新しいプロセスを作成する方法が変更されたことがわかりました。

  • Linux システムは常にフォークを使用して新しいプロセスを作成します。フォーク中、親プロセスのすべてのリソースが子プロセスに継承されるため、親プロセスでグローバルに定義された同期変数には子プロセスからもアクセスできるため、データの一貫性が維持されます
  • Windows システムは常に spawn を使用します。これは、マルチ処理を実装するために新しい Python インタープリター プロセスを作成する方法です。これは Python を「さらに開く」ことに相当するため、オーバーヘッドが増加し、効率が低下しますが、これは Windows システム自体の制限です。この場合、子プロセス は、親プロセス の run() メソッドが新しいプロセスを開始するために必要なリソースのみを継承します。
  • macOS システムは、Python 3.8 より前は fork を使用していましたが、 は spawn に変更されたため、いくつかのマルチプロセスの動作が変更されました。 (macOS はフォークを使用するように設定できますが、Python は公式には推奨されていません)

私の例では、Synchronized 変数は親プロセスでグローバルに宣言されているため、Windows および macOS システムでは子プロセスに継承されず、Linux システムでは値が異なります。 、親プロセスのすべてのリソースが継承されるため、子プロセスはその値を変更できます。

これにより、私が見た現象が発生しました。macOS 上の私のコードのグローバル同期変数は変更されませんでしたが、他の人の Linux システムは正常に実行され、変数はすべてのプロセス間で同期されました。

参考資料:

  • https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
  • https://docs.python.org/3/library/multiprocessing.html#multiprocessing.sharedctypes.synchronized

以上がオペレーティング システムごとに同期変数の動作が異なるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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