다중 처리로 데이터를 수집하는 데 pyserial을 사용하고 있습니다. 데이터를 공유하는 방식은 매우 간단합니다. 그래서 :파이썬 : 다중 처리에서 단일 잠금 교착 상태
내 클래스의 멤버 개체가 :
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()
문제 :
이제 부 상기의 처리 기능의 목록을 채워
잠금이 하나 밖에 없지만 내 프로그램이 가끔 교착 상태로 끝나는 경우가 있습니다! 잠시 기다린 후에 프로그램이 멈 춥니 다. 자물쇠 앞뒤에 지문을 추가 한 후 잠금 상태에서 멈추고 교착 상태에 이른 것으로 나타났습니다.
재귀 잠금 RLock()
을 사용하면 문제없이 작동합니다. 내가 그렇게해야하는지 확신 할 수 없다.
어떻게 가능합니까? 내가 뭔가 잘못하고 있는거야? 두 프로세스가 모두 잠금을 획득하려고 시도하면 다른 프로세스가 잠금을 해제 할 때까지 차단해야합니다.
당신은'shared_lock.acquire()'와'self.shared_result_lock.acquire()'를 가지고 있습니다. 'shared_lock' 변수가 무엇인지는 명확하지 않습니다. – Gerrat
@Gerrat 인수와 동일한 잠금이 전달됩니다. –