パイプ通信を使用するPythonマルチプロセッシングmultiprocessing.pipeプロデューサープロセスとコンシューマープロセスは、同時に実行する必要があります。
テストの結果、生産がない場合、消費は実行されません。
たとえば、次のプログラムでは、プロデューサーは10から30の間のデータを送信しませんが、コンシューマーは実行しません(出力なし)。
なんで?受信側は実行されていませんが、10がデータの受信を待機している場所で動かなくなっています。!!!私のブログの2番目の状況を参照してください
さらに真剣に、これは例外ではなく、キャプチャすることはできません!受信側のプログラムは実行できません!!(次の送信者からのデータが到着する前)
解決策:おい、良い解決策がない場合は、代わりにmultiprocessing.Managerのキューを使用してください!Manager.Queue()Dafaは良いです!
良い方法はありますか?ようこそ教えて!!!
次のコードは、PEP8仕様に準拠しています。(私がコードが乱雑であると告白される前は、人々は読む気がありませんでした...)
import time
from multiprocessing import Pipe, Process
def sed_fun(p_conn):
all_sed = 0
s, r = p_conn
send_num = 0
while True:
time.sleep(1)
all_sed += 1
print('sending...', all_sed)
try:
send_num += 1
print('try to send', send_num)
if send_num < 10:
msg = 1111
print('sending', msg)
s.send([msg])
elif send_num > 30:
msg = 2222
print('sending', msg)
s.send([msg])
else:
print('no send any more')
# sed.close() # uncomment will cause the sed proc not to be resurrected after 30
except Exception as e:
print(e)
print('can not send')
def rec_fun(p_conn):
all_rec = 0
s, r = p_conn
while True:
time.sleep(1)
all_rec += 1
print('\nreceiving.....', all_rec)
try:
print('\n', r.recv()) # If there is no data in pipe, it will be stuck here with no notification!!!
except Exception as e: # this except has no use when stucked above!
print(e)
print('can not recv')
if __name__ == '__main__':
sed, rec = Pipe()
sed_proc = Process(target=sed_fun, args=((sed, rec), ))
rec_proc = Process(target=rec_fun, args=((sed, rec), ))
sed_proc.start()
rec_proc.start()
sed_proc.join()
rec_proc.join()