On 2016-12-24 01:17, Charles Hixson wrote:


On 12/23/2016 01:56 PM, Charles Hixson wrote:
I was looking to avoid using a upd connection to transfer messages
between processes, so I thought I'd use multiprocessing (which I
expect would be faster), but...I sure would appreciate an explanation
of this problem.

When I run the code (below) instead of messages receiving messages
from the correct process I get:
(where the first number of a line identifies the index assigned to the
process.)

waiting for completion
The receiving process should be the one sent to.

          receiving sending                   sent to
   ndx process name                                    process
name          ndx
1=Process-2 received: at time 0.001243: Process-1 says Hi to 0
0=Process-1 received: at time 0.001211: Process-2 says Hi to 1
0=Process-1 received: at time 0.001144: Process-3 says Hi to 2
4=Process-5 received: at time 0.002324: Process-1 says Hi to 0
0=Process-1 received: at time 0.000953: Process-4 says Hi to 3
0=Process-1 received: at time 0.000674: Process-5 says Hi to 4
3=Process-4 received: at time 0.002114: Process-1 says Hi to 0
3=Process-4 received: at time 0.001864: Process-2 says Hi to 1
4=Process-5 received: at time 0.002094: Process-2 says Hi to 1
2=Process-3 received: at time 0.001711: Process-1 says Hi to 0
4=Process-5 received: at time 0.001885: Process-3 says Hi to 2
4=Process-5 received: at time 0.001586: Process-4 says Hi to 3
1=Process-2 received: at time 0.001456: Process-3 says Hi to 2
3=Process-4 received: at time 0.001734: Process-3 says Hi to 2
2=Process-3 received: at time 0.00158: Process-2 says Hi to 1
2=Process-3 received: at time 0.001444: Process-4 says Hi to 3
2=Process-3 received: at time 0.001088: Process-5 says Hi to 4
3=Process-4 received: at time 0.001221: Process-5 says Hi to 4
1=Process-2 received: at time 0.001212: Process-4 says Hi to 3
1=Process-2 received: at time 0.000885: Process-5 says Hi to 4

##    Test multiprocessing queues
import    multiprocessing    as    mp
import    time

from    multiprocessing    import    Process
from    multiprocessing    import    Queue
from    queue                    import    Empty
from    queue                    import    Full
from    random                import    random


class TestMPQ:
    """ Class doc """

    def __init__ (self, ndx):
        """ Class initialiser """
        self.name    =    mp.current_process().name
        self.ndx    =    ndx

    def    sendHi (self):
        for i in range(5):
            if i != self.ndx:
                qs[i].put ("{} says Hi to {}".format(self.name,
self.ndx))

"self.ndx" is the sender's (my) index, "i" is the receiver's (your index), so the message you're building is:

    <my name> says Hi to <my index>

which you then put in the receiver's (your) queue.

    def    processHi (self):
        while (True):
            time.sleep(random() + 0.001)
            try:
                msg    =    qs[self.ndx].get_nowait()
                print ("{}={} received: {}".format(self.ndx,
self.name, msg) )
            except    Empty:
                break
            except Exception as ex:
                print ("Exception: ", repr(ex))
                break

def    procHandler (ndx, qs):
    p    =    TestMPQ(ndx)
    p.sendHi()
    p.processHi()

if "__main__" == __name__:
    qs    =    []
    for i in range(5):
        qs.append(Queue())
    ps    =    []
    for i in range(5):
        ps.append(Process(target = procHandler, args = (i, qs) ) )
        ps[i].start()
    print ("waiting for completion")
    for i in range(5):
        ps[i].join()




--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to