Non capisco perché Pipes
non sia sicuro quando ci sono più mittenti e ricevitori.Perché il tubo multiprocessing Python non è sicuro?
In che modo è possibile trasformare il codice seguente in codice utilizzando Queues
in questo caso? Queues
non lanciare EOFError
quando è chiuso, quindi i miei processi non possono fermarsi. Devo inviare infinitamente messaggi 'Veleno' per dire loro di smettere (in questo modo, sono sicuro che tutti i miei processi ricevono almeno un veleno)?
Vorrei mantenere aperta la pipe p1
finché non decido diversamente (qui è quando ho inviato i 10 messaggi).
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()
Cosa succede se uso 'multiprocessing.Lock()' quando si utilizza 'recv' e' send' di una pipe? Diventerà sicuro (ed efficiente)? – thuzhf
Se lo fai, in pratica finirai con un 'Queue' -' multiprocessing.Queue' è un 'Pipe' con un paio di blocchi collegati (uno per ogni direzione). Quindi, sarebbe sicuro e ragionevolmente efficiente, ma dovresti anche reinventare direttamente la ruota - perché non usare solo "Queue"? – nneonneo