[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