Ich verstehe nicht, warum Pipes
unsicher sind, wenn es mehrere Absender und Empfänger gibt.Warum sind Python-Multiprocessing-Pipes unsicher?
Wie kann der folgende Code mit Queues
in Code umgewandelt werden, wenn dies der Fall ist? Queues
werfen Sie nicht EOFError
wenn geschlossen, damit meine Prozesse nicht aufhören können. Sollte ich endlos "Poison" -Botschaften senden, um ihnen zu sagen, dass sie aufhören sollen (auf diese Weise bin ich sicher, dass alle meine Prozesse mindestens ein Gift erhalten)?
Ich möchte die Pipe p1
offen halten, bis ich anders beschließe (hier ist es, wenn ich die 10 Nachrichten gesendet habe).
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()
Was passiert, wenn ich 'multiprocessing.Lock()' benutze, wenn 'recv' und' send' einer Pipe verwendet werden? Wird es sicher (und effizient)? – thuzhf
Wenn Sie das tun, erhalten Sie am Ende eine 'Queue' -' multiprocessing.Queue' ist eine 'Pipe' mit einem Paar von Schlössern (eines für jede Richtung). Es wäre also sicher und einigermaßen effizient, aber Sie würden auch das Rad neu erfinden - warum nicht einfach 'Queue' verwenden? – nneonneo