pythonマルチプロセッシングマルチプロセスを達成するための変数を共有し、ロックされました

この記事では、マルチプロセスは、変数のロックの実装、非常に詳細に説明した紙サンプルコードを共有するマルチプロセッシングとPythonを説明習得したり、作業するために私たちのすべてのための学習の一定の基準値を持っている、あなたは小さなシリーズとして以下に友人を必要としますそれから一緒に学ぶこと
ではない前と相互依存関係の仕事の多くは、場合は、その後、実際には順序が、順序の言葉実行の使用は非常に重要ではないためだろう確実に不要な待ち時間の原因にもかかわらず、マルチプロセスとマルチスレッドは、我々は一部を理解することに焦点を当てることであるパイソン私たちが見てみたい、CPUとメモリの廃棄物、。

この問題を解決するために、方法は、我々は、マルチスレッドやマルチプロセスは、(私たちは、マルチスレッドの後にリピート)を採用してもよいし、2つの本質的な違いです。メモリに、プロセスは、実装工程において別々のメモリユニットを有することが知られており、複数のスレッドは、マルチプロセス、マルチスレッドとの間の大きな違いであるメモリを、共有されています。

異なるプロセス内の変数を使用して値の同期

この方法は、直接共有変数を使用して、複数のプロセスで読み取ることができないので、プロセス間のメモリは、互いに分離されているので、マルチプロセスでは、ライブラリ値をマルチプロセッシング使用することができ、この時間は、それらの単離プロセスの変数を共有しました。

ここで、マルチプロセスの一例です。

仮定プログラムを通じて総サイクル数を記録するために使用カウンタがあり、カウンタのカウント関数の後に、すべてのコールは20に増加し、10のオープンサイクルプロセスは、10のプロセスでより少ない理想状態よりも下で、メイン関数呼び出し回数で使用されていますプログラムの最後に共有カウンタの値が200である必要があります。

from multiprocessing import Process, Value
import time
 
def count(v):
  for i in range(20):
    time.sleep(0.01)
    v.value += 1
 
def main():
  value = Value('i',0)
  processes = [Process(target=count, args=(value,)) for i in range(10)]
 
  for p in processes:
    p.start()
  for p in processes:
    p.join()
 
  print(value.value)
 
if __name__ == '__main__':
 
  for i in range(10):
    main()

この例を実行するには、どのような結果を得ますか?

188
180
168
186
183
179
186
181
166
186

私は、メインプログラムで、このプログラムの10時間を実行し、最終結果は、短期では、160から180の間200には時間ではありません。これはそれの原因は何ですか?

私は多くの人が問題を認識していると信じて、それはライブラリをマルチプロセッシングにおける価値ファイングレインであるため、値はオブジェクトのctypes型がメモリに実際のオブジェクトを特徴付けるためにvalue属性を持っています。値は、読み取りまたは書き込み値の値でのみ1つのスレッドやプロセスを保証することができます。だから、何の問題を見ていません。

しかし、最初のプロセスが値値をロードするとき、プログラムは、第二の古い値をロードするプロセスを停止することはできません。両方のプロセスは、独自のプライベートメモリに値をコピーして処理され、内部の共通の価値観に書き戻されます。

それでは何が起こるのだろうか?

最終株式価値だけではなく、2倍以上、一度値の増加を受けました。

ロックが共有別のプロセス変数の使用でロックされ
、実際に解決するために非常に単純な方法を使用することができます問題の上に、私達はちょうどあなたがそれだけで一つのプロセスが共有変数にアクセスすることを確認することができますマルチプロセッシングライブラリーロック(ロック)を呼び出す必要があります。次のようにコードを変更しました。

from multiprocessing import Process, Value, Lock
from time import sleep
 
def count(x,lock):
  for i in range(20):
    sleep(0.01)
    with lock:
      x.value += 1
 
 
def main():
  counter = Value('i',0)
  lock = Lock()
  processes = [Process(target=count,args=(counter,lock)) for i in range(10)]
  for p in processes:
    p.start()
  for p in processes:
    p.join()
 
  print(counter.value)
 
if __name__ == '__main__':
  for i in range(10):
    main()

その結果、出力200は一定となります。

いくつかのサプリメント

  1. コールGET_LOCK()関数があり
    ますが、自動的に共有変数にロックすることができGET_LOCK()関数を呼び出す場合、値パッケージはすでに、ロックの概念を含んでいるという事実に。それは同時に2つのパッケージを呼び出す必要はありませんので、実際には、これは、より推奨される方法です。次のように改正:
from multiprocessing import Process, Value
from time import sleep
 
def count(x):
  for i in range(20):
    global counter # 声明全局变量
    sleep(0.01)
    with counter.get_lock(): # 直接调用get_lock()函数获取锁
      x.value += 1
 
def main():
  processes = [Process(target=count, args=(counter,)) for i in range(10)]
  for p in processes:
    p.start()
  for p in processes:
    p.join()
 
  print(counter.value)
 
if __name__ == '__main__':
  counter = Value('i', 0) # 需要把全局变量移到主程序
  main()

上記の手順は、より明確であり、最終的な結果は200です。

  1. 使用multiprocessing.RawValue
    だけ価値とロックと呼ばれる全体のマルチプロセッシングバッグもmultiprocessing.RawValueを交換統一することができます。
    公共機関の数で良い評判をお勧めするどのように多くの、そして最終的にはより多くのコンテンツ[プログラマ]、学習古いタイマーがたくさんあります

スキルは、経験、面接スキル、職場体験や他のシェアを学んで、より慎重に、実際のプロジェクトのゼロベースの入門情報、情報を準備しました

時限プログラマPythonは日常の技術を説明している方法は、学習と細部への注意を払う必要性へのいくつかを共有します
ここに画像を挿入説明

公開された58元の記事 ウォン称賛11 ビュー50000 +

おすすめ

転載: blog.csdn.net/chengxun02/article/details/105128766
おすすめ