Pythonマルチプロセスのlockメカニズム!

1898 ワード

はじめに
Pythonではマルチプロセスが相互に実行され互いに干渉しないことを知っていますが、マルチプロセス間で同じリソースオブジェクトを操作する必要がある場合や、複数のプロセス間で相互に依存する必要がある場合は、マルチプロセスで使用するために共有変数が必要です.Python multiprocessingマルチプロセス間の相互協調の方式は以下の通りである:Lock:ロック,Queue:キュー,Semaphore:信号量,Event:イベント,Pipe:パイプ.
次の文章では、このいくつかの方法を紹介します.本文はロック:ロックを勉強します.
Pythonリソース共有グループ:484031800
 
二実践
複数のプロセスが共有リソースにアクセスする必要がある場合、ロックはアクセスの競合を回避するために使用できます.1つのシーンがトランザクションされていない状態でメモリ変数に共通にアクセスするか、複数のプロセスが同じファイルにアクセスするかを考えます.
初期化lockは簡単です.
ロック=ロック()でロックオブジェクトを作成できます.
このオブジェクトはグローバルオブジェクトであり、すべてのサブプロセスで使用できます.
 
2.1 no lock
 
 

# encoding: utf-8 """author: [email protected]:2019/8/10 5:48 PM func:"""from multiprocessing import Process,Value,Lock def sub(num):num.value+=1 if__name_='_main_':lock=Lock()#ロックオブジェクトval=Value('i',0)#Valueは共有メモリを介してデータ初期値valが0 proc=[process(target=sub,args=(val,))for i in xrange(time)fori in xrange(100)]for p in proc:p.start()for p in proc:p.join()print'が100回加算された後のvalの値は:%d'%val.value
結果
 
 
 
共有メモリ内のvalが同時にアクセスできるため、val=90が存在する場合、複数に1結果val=91を同時に加算され、例えば3回、結果はval=98となる
 
2.2 lock
 
 

# encoding: utf-8 """author: [email protected]:2019/8/10 5:38 PM func:"""from multiprocessing import Process,Value,Lock def sub(num,lock):#転送されたlockオブジェクトlock.acquire()#申請ロック、lockオブジェクトlocked、その他のプロセスをブロックしてlockオブジェクトnum.value+=1 lock.release()#ロックを解除し、lockオブジェクトがunlockedになり、他のプロセスはlockオブジェクトif_を再取得できます.name__ == '__main__': lock=Lock()ロックオブジェクトval=Value('i',0)proc=[process(target=sub,args=(val,lock))for i in xrange(100)]for p in proc:p.start()for p in proc:p.join()print'100回の累積後のvalの値は:%d'%val.value
lockで+1の動作をシリアル化できます.書き込みオーバーライドが発生しないことを確認します.
結果