I want to process a bunch of processes that all talk to each other.
I've figured out how to do this using queues with the main process as
the mail handler, but I'd rather have them talk directly. If I use
connections, then I can pass the pipes to the processes, but there
doesn't seem to be anything analogous to queue, so it looks like I need
to divide each process into two threads, one of which does nothing but
mail handling.
Is this correct?
FWIW, a small, unoptimized, test of the working "mailhandler" approach is:
## Multiprocessing: main thread as post office.
# This is a bit clumsy, but it works.
from multiprocessing import Process, Queue
from queue import Empty
def f(i, lim, q_rcv, q_snd):
for j in range(lim):
if i != j:
q_snd.put([i, "message from process {0} to proess
{1}".format(i, j), j])
if not q_rcv.empty():
val = q_rcv.get()
print (val)
q_snd.put([i, "done"])
while (not q_recv.empty()):
val = q_rcv.get()
print (val, " :: ", i)
if val == "done": return
if __name__ == '__main__':
ps = []
qs = []
q_recv = Queue()
for i in range(3):
q = Queue()
qs.append (q)
ps.append (Process(target=f, args=(i, 3, q, q_recv)) )
for p in ps:
p.start()
dones = 0
try:
v = q_recv.get(True, 1)
while (v):
print ("v = ", v)
if v[1] == "done":
dones = dones + 1
else:
if len(v) == 3:
assert v[2] < len(qs), "unexpected value"
qs[v[2]].put(v[1])
else:
print ("error: ", v, " was an unexpected value.")
v = q_recv.get(True, 1)
except Empty:
print ("1: Timeout of maine receive queue")
for q in qs:
q.put("done")
try:
v = q_recv.get(True, 1)
while (v):
print ("2: v = ", v)
if v[1] == "done":
dones = dones + 1
else:
if len(v) == 3:
assert v[3] < len(qs), "2: unexpected value"
qs[v[3]].put(v[2])
else:
print ("2: error: ", v, " was an unexpected value.")
v = q_recv.get(True, 1)
except Empty:
print ("2: Timeout of maine receive queue")
for i in range(len(qs)):
qs[i].close();
qs[i] = None
--
https://mail.python.org/mailman/listinfo/python-list