2016-09-22 6 views
0

マルチセービングでデータを取得するためにpyserialを使用しています。私がデータを共有する方法は非常に簡単です。Python:マルチプロセッシングでの単一ロックのデッドロック

私は私のクラスのメンバオブジェクトがあります:だから

self.mpManager = mp.Manager() 
self.shared_return_list = self.mpManager.list() 
self.shared_result_lock = mp.Lock() 

を私は私のマルチプロセッシング・プロセスをこのように呼ん:

do_my_stuffはグローバル関数である
process = mp.Process(target=do_my_stuff, 
args=(self.shared_stopped, self.shared_return_list, self.shared_result_lock) 
) 

今一部の塗りつぶし処理機能でリスト:

if len(acqBuffer) > acquisitionSpecs["LengthToPass"]: 
    shared_lock.acquire() 
    shared_return_list.extend(acqBuffer) 
    del acqBuffer[:] 
    shared_lock.release() 

そして使用するためにローカルスレッドにあることを要する部分がある:

while len(self.acqBuffer) <= 0 and (not self.stopped): 
    #copy list from shared buffer and empty it 
    self.shared_result_lock.acquire() 
    self.acqBuffer.extend(self.shared_return_list) 
    del self.shared_return_list[:] 
    self.shared_result_lock.release() 

問題

ロックは1つしかありませんが、私のプログラムは時折デッドロックで終了します!しばらく待ってから、プログラムがフリーズします。ロックの前後にプリントを追加した後、ロック時にフリーズし、何とかデッドロックに達していることがわかりました。

再帰的なロックRLock()を使用すると問題なく動作します。私がそれをするべきかどうかはわかりません。

これはどのように可能ですか?私は何か間違っているのですか?両方のプロセスがロックを取得しようとすると、他のプロセスがロックを解除するまでブロックする必要があります。

+0

あなたは 'shared_lock.acquire()'と 'self.shared_result_lock.acquire()'を持っています。 'shared_lock'変数は本当に明確ではありませんか? – Gerrat

+0

@Gerrat引数と同じロックが渡されます。 –

答えて

0

デッドロックではないことが判明しました。私のせい!問題は、デバイスから取得したデータが

shared_return_list.extend(acqBuffer) 
del acqBuffer[:] 

を介してデータをコピーすることを時々とても巨大であるプログラムがフリーズすることは非常に長い時間がかかるということでした。データをチャンク単位で移動し、デバイスから引き出すデータ量を制限することで、この問題を解決しました。

1

SSCCEがなければ、あなたのコードに何か他のことが起こっているかどうかを知ることは難しいです。

ロックを取得した後に例外がスローされる可能性があります。ロックされたセクションのそれぞれをtry/finally節でラップしてみてください。例えば。

try: 
    shared_lock.acquire() 
    shared_return_list.extend(acqBuffer) 
    del acqBuffer[:] 
finally: 
    shared_lock.release() 

と:あなたも例外条項を追加し、これが問題であることが判明した場合、発生したすべての例外をログに記録でき

try: 
    self.shared_result_lock.acquire() 
    self.acqBuffer.extend(self.shared_return_list) 
    del self.shared_return_list[:] 
finally: 
    self.shared_result_lock.release() 

+0

+1私が知りませんでした何かを教えてくれました。これは '最後に' lock_guardを実装する方法です。ありがとう!しかし、それは問題を解決しませんでした。 –

+0

@TheQuantumPhysicist:あまりにも悪い。私は本当にそれが問題だったと思った。他の人が実行できる小さな例を作成できれば、その問題を発見するか、他の人があなたをより良く助ける手助けをするでしょう。 – Gerrat

+0

実際に私のSSCCEには問題がありません。だから私はまだそれを引き起こしていることを調べている。ありがとう:) –

関連する問題