マルチセービングでデータを取得するために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()
を使用すると問題なく動作します。私がそれをするべきかどうかはわかりません。
これはどのように可能ですか?私は何か間違っているのですか?両方のプロセスがロックを取得しようとすると、他のプロセスがロックを解除するまでブロックする必要があります。
あなたは 'shared_lock.acquire()'と 'self.shared_result_lock.acquire()'を持っています。 'shared_lock'変数は本当に明確ではありませんか? – Gerrat
@Gerrat引数と同じロックが渡されます。 –