| 123456789101112131415161718192021222324252627282930313233343536373839404142 | from __future__ import absolute_importfrom threading import Threadtry:    from Queue import Queue, Emptyexcept ImportError:    from queue import Queue, Empty  # Python 3.x# Yield STOP from an input generator to stop the# top-level loop without processing any more input.STOP = object()class Multiplexer(object):    def __init__(self, generators):        self.generators = generators        self.queue = Queue()    def loop(self):        self._init_readers()        while True:            try:                item = self.queue.get(timeout=0.1)                if item is STOP:                    break                else:                    yield item            except Empty:                pass    def _init_readers(self):        for generator in self.generators:            t = Thread(target=_enqueue_output, args=(generator, self.queue))            t.daemon = True            t.start()def _enqueue_output(generator, queue):    for item in generator:        queue.put(item)
 |