'Yield elements from the end of the pipeline. Runs the stages
sequentially until the last yields some messages. Each of the messages
is then yielded by ``pulled.next()``. If the pipeline has a consumer,
that is the last stage does not yield any messages, then pull will not
yield any messages. Only the first coroutine in each stage is used'

def pull(self):

    coros = [stage[0] for stage in self.stages]
    for coro in coros[1:]:
        next(coro)
    for out in coros[0]:
        msgs = _allmsgs(out)
        for coro in coros[1:]:
            next_msgs = []
            for msg in msgs:
                out = coro.send(msg)
                next_msgs.extend(_allmsgs(out))
            msgs = next_msgs
        for msg in msgs:
            (yield msg)
