私はプロデューサとコンシューマプロセスとそれらの間に共有メモリ領域を持っています。 Conditionオブジェクトを使用して、新しいデータが利用可能なときにプロデューサプロセスからコンシューマプロセスを通知します。他のプロセスが準備される前にCondition.notify()を呼び出すときのPythonマルチプロセッシングのデッドロック
現在の問題は、以下のトレースと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