저는 프로듀서와 소비자 프로세스 및 이들 사이에 공유 메모리 영역을 가지고 있습니다. Condition 객체를 사용하여 새 데이터를 사용할 수있을 때 생성자 프로세스에서 소비자 프로세스에 신호를 보냅니다.다른 프로세스가 준비되기 전에 Condition.notify()를 호출 할 때 파이썬 다중 처리 교착 상태가 발생했습니다.
현재 문제는 다음과 같은 추적과 cond.wait에 ArrayConsumer 교착 상태()이다 :
Producer: (3, 3, 30, 100)
Producer Done
Consumer: (3, 3, 30, 100)
Consumer Waiting...
무엇에 대한 이해에서 일어나고있는 것은 소비자가 알림을 수신 할 준비가되기 전에 생산자가 소비자에게 통지 것입니다 따라서 제작자의 알림을 기다리고 있습니다. 준비가되었을 때만 소비자에게 알려주는 가장 좋은 방법은 무엇입니까?
def ArrayConsumer(aArray, cond):
print('Consumer:', aArray.shape)
with cond:
print('Consumer Waiting...')
cond.wait()
print('Waiting finished..')
print('Consumer:', aArray[1, 1, 1, 1])
def ArrayProducer(aArray, cond):
print('Producer:', aArray.shape)
with cond:
aArray.fill(1)
cond.notify()
print('Producer Done')
if __name__ == '__main__':
# sharing numpy arrays
csi = csiMatrix(3, 3, 30, 100)
shared = sm.sharedmem.empty(csi.shape, dtype=complex)
shared[:] = csi
cond = Condition()
p = Process(target=ArrayProducer, args=(shared, cond,))
c = Process(target=ArrayConsumer, args=(shared, cond,))
p.start()
c.start()
p.join()
c.join()
개인적으로 "최선"은 '조건'을 전혀 신경 쓰지 않는 것입니다. 생성 된 데이터를 소비자에게 보내려면 '대기열'을 사용하십시오. – torek
여러 GB의 데이터가 있습니다. 대기열은이를 보관하거나 직렬화 및 직렬화를 해제하는 데 너무 오래 걸릴 수 없습니다. –
큰 데이터를 가지고 있다면,'Queue' 객체 *가 값이 너무 비싸다는 것을 알 수 있습니다. [noxdafox said] (http://stackoverflow.com/a/44084827/1256452) 기본적으로 잠금으로 감싼 플래그 인'Event' 객체를 사용할 수 있습니다. – torek