[Python-ideas] Tulip / PEP 3156 - subprocess events

Paul Moore p.f.moore at gmail.com
Tue Jan 22 17:10:18 CET 2013


On 22 January 2013 15:43, Paul Moore <p.f.moore at gmail.com> wrote:
> I'll try implementing the pipe transport approach and see how it looks
> in contrast.

Here's a quick proof of concept (for a read pipe):

class UnixEventLoop(events.EventLoop):
    ...
    @tasks.task
    def connect_read_pipe(self, protocol_factory, rpipe):
        protocol = protocol_factory()
        waiter = futures.Future()
        transport = _UnixReadPipeTransport(self, rpipe, protocol, waiter)
        yield from waiter
        return transport, protocol

class _UnixReadPipeTransport(transports.Transport):

    def __init__(self, event_loop, rpipe, protocol, waiter=None):
        self._event_loop = event_loop
        self._pipe = rpipe.fileno()
        self._protocol = protocol
        self._buffer = []
        self._event_loop.add_reader(self._pipe.fileno(), self._read_ready)
        self._event_loop.call_soon(self._protocol.connection_made, self)
        if waiter is not None:
            self._event_loop.call_soon(waiter.set_result, None)

    def _read_ready(self):
        try:
            data = os.read(self._pipe, 16*1024)
        except BlockingIOError:
            return
        if data:
            self._event_loop.call_soon(self._protocol.data_received, data)
        else:
            self._event_loop.remove_reader(self._pipe)
            self._event_loop.call_soon(self._protocol.eof_received)


Using this to re-implement the subprocess test looks something like
this (the protocol is unchanged from the existing test):

def testUnixSubprocessWithPipe(self):
    proc = subprocess.Popen(['/bin/ls', '-lR'], stdout=subprocess.PIPE)
    t, p = yield from self.event_loop.connect_read_pipe(MyProto, proc.stdout)
    self.event_loop.run()

To be honest, this looks sufficiently straightforward that I don't see
the benefit in a less-general high-level transport type...

Paul



More information about the Python-ideas mailing list