2016-09-22 2 views
0

다중 처리로 데이터를 수집하는 데 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()을 사용하면 문제없이 작동합니다. 내가 그렇게해야하는지 확신 할 수 없다.

어떻게 가능합니까? 내가 뭔가 잘못하고 있는거야? 두 프로세스가 모두 잠금을 획득하려고 시도하면 다른 프로세스가 잠금을 해제 할 때까지 차단해야합니다.

+0

당신은'shared_lock.acquire()'와'self.shared_result_lock.acquire()'를 가지고 있습니다. 'shared_lock' 변수가 무엇인지는 명확하지 않습니다. – Gerrat

+0

@Gerrat 인수와 동일한 잠금이 전달됩니다. –

답변

0

교착 상태가 아닙니다. 내 잘못! 문제는 장치로부터 획득 한 데이터가

shared_return_list.extend(acqBuffer) 
del acqBuffer[:] 

를 통해 데이터를 복사하는 것을 때때로 너무 크다 프로그램이 정지하는 시간이 오래 걸린다이었다. 데이터를 청크로 이동하고 장치에서 가져올 데이터의 양을 제한하여이 문제를 해결했습니다.

1

SSCCE이 없어도 코드에 다른 문제가 있는지 알기가 어렵습니다.

잠금을 획득 한 후 예외가 throw 될 가능성이 있습니다. 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에는 문제가 없습니다. 그래서 나는 아직도 그 원인을 조사하고 있습니다. 감사 :) –

관련 문제