No entiendo por qué Pipes
se dicen inseguros cuando hay varios remitentes y receptores.¿Por qué el tubo de multiprocesamiento Python no es seguro?
¿Cómo se puede convertir el siguiente código en código usando Queues
si este es el caso? Queues
no arroje EOFError
cuando está cerrado, por lo que mis procesos no pueden detenerse. ¿Debo enviar mensajes interminables de 'Veneno' para decirles que se detengan (de esta manera, estoy seguro de que todos mis procesos reciben al menos un veneno)?
Me gustaría mantener la tubería p1
abierta hasta que decida lo contrario (aquí es cuando he enviado los 10 mensajes).
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()
¿Qué ocurre si utilizo 'multiprocesamiento.Lock()' cuando uso 'recv' y' send' de una tubería? ¿Será seguro (y eficiente)? – thuzhf
Si lo hace, básicamente terminará con 'Queue' -' multiprocesamiento.Queue' es un 'Pipe' con un par de bloqueos conectados (uno para cada dirección). Entonces, sería seguro y razonablemente eficiente, pero también estarías reinventando la rueda directamente, ¿por qué no usar 'Queue'? – nneonneo