[Python-ideas] channel (synchronous queue)

Sturla Molden sturla at molden.no
Sun Feb 19 21:23:03 CET 2012


Den 19.02.2012 20:04, skrev Guido van Rossum:
> Also, writing a performant Channel implementation for multiprocessing 
> would hardly be a trivial job;

I think this should work :-)

Sturla




from multiprocessing import Lock, Event, Pipe

class Channel(object):

     def __init__(self):
         self._writelock = Lock()
         self._readlock = Lock()
         self._new_data = Event()
         self._recv_data = Event()
         self._conn1, self._conn2 = Pipe(False)

     def put(self, msg):
         with self._writelock:
             self._conn2.send(msg)
             self._new_data.set()
             self._recv_data.wait()
             self._recv_data.clear()

     def get(self):
         with self._readlock:
             self._new_data.wait()
             msg = self._conn1.recv()
             self._new_data.clear()
             self._recv_data.set()
         return msg



## -------------

def proc2(channel):
     from sys import stdout
     for i in range(1000):
         msg = channel.get()
         stdout.flush()
         print "Process 2 received '%s'\n" % msg,
         stdout.flush()

def proc1(channel):
     from sys import stdout
     for i in range(1000):
         stdout.flush()
         print "Process 1 preparing to send 'message %d'\n" % i,
         stdout.flush()
         msg = channel.put(("message %d" % i,))
         stdout.flush()
         print "Process 1 finished sending 'message %d'\n" % i,
         stdout.flush()

if __name__ == "__main__":

     from multiprocessing import Process

     channel = Channel()
     p2 = Process(target=proc2, args=(channel,))
     p2.start()
     proc1(channel)
     p2.join()



More information about the Python-ideas mailing list