Ich habe einen Produzenten und Verbraucher-Prozess und eine gemeinsame Speicherbereich zwischen ihnen. Ich verwende das Condition-Objekt, um den Konsumentenprozess aus dem Produzentenprozess zu signalisieren, wenn neue Daten verfügbar sind.Python-Multiprozessor-Deadlock beim Aufruf von Condition.notify(), bevor der andere Prozess bereit ist
Aktuelles Problem ist die ArrayConsumer Deadlocks auf cond.wait() mit der folgenden Spur:
Producer: (3, 3, 30, 100)
Producer Done
Consumer: (3, 3, 30, 100)
Consumer Waiting...
Was aus meinem Verständnis geschieht, ist, dass der Hersteller die Verbraucher informiert, bevor die Verbraucher bereit ist, die Benachrichtigung zu erhalten, und wartet daher auf die Benachrichtigung des Herstellers. Was ist der beste Weg, um sicherzustellen, dass der Verbraucher nur dann signalisiert wird, wenn er bereit ist?
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()
Persönlich denke ich, dass der "beste" Weg ist, sich nicht mit 'Condition' zu beschäftigen: Verwenden Sie eine' Queue', um produzierte Daten an die Konsumenten zu senden. – torek
Ich habe mehrere GB Daten. Eine Warteschlange könnte es nicht halten oder zu lange dauern, um sie zu serialisieren und zu serialisieren. –
Wenn Sie große Daten haben, dann ja, ein 'Queue'-Objekt * kann * zu teuer sein (aber Sie sollten dies messen, um zu sehen). Wie [noxdafox sagte] (http://stackoverflow.com/a/44084827/1256452) können Sie ein 'Event'-Objekt verwenden, bei dem es sich im Wesentlichen um ein mit einer Sperre umschlossenes Flag handelt. – torek