複数の送信者と受信者が存在する場合、なぜPipes
が安全でないと言われているのか分かりません。Pythonマルチプロセッシングパイプが安全でないのはなぜですか?
この場合、Queues
を使用して次のコードをコードに変換する方法はありますか? Queues
閉じてもEOFError
が投げられないので、私のプロセスは停止できません。無限に 'Poison'メッセージを送信して停止するように指示する必要があります(この方法では、すべてのプロセスに少なくとも1つの毒が与えられます)。
私がそうでないと決めるまで、私はパイプp1
を開いたままにしておきたいと思います(ここでは10のメッセージを送ったときです)。
from multiprocessing import Pipe, Process
from random import randint, random
from time import sleep
def job(name, p_in, p_out):
print(name + ' starting')
nb_msg = 0
try:
while True:
x = p_in.recv()
print(name + ' receives ' + x)
nb_msg = nb_msg + 1
p_out.send(x)
sleep(random())
except EOFError:
pass
print(name + ' ending ... ' + str(nb_msg) + ' message(s)')
if __name__ == '__main__':
p1_in, p1_out = Pipe()
p2_in, p2_out = Pipe()
proc = []
for i in range(3):
p = Process(target=job, args=(str(i), p1_out, p2_in))
p.start()
proc.append(p)
for x in range(10):
p1_in.send(chr(97+x))
p1_in.close()
for p in proc:
p.join()
p1_out.close()
p2_in.close()
try:
while True:
print(p2_out.recv())
except EOFError:
pass
p2_out.close()
パイプの 'recv'と' send'を使うときに 'multiprocessing.Lock()'を使うとどうなりますか?それは安全になる(効率的になる)のだろうか? – thuzhf
これを行うと、基本的に 'Queue' - ' multiprocessing.Queue'はロックのペア(各方向に1つ)が付いた 'Pipe'です。したがって、安全で合理的に効率的ですが、ホイールを再発明することもできます。なぜなら、単に「キュー」を使用するだけではないからです。 – nneonneo