def __init__(self, callback=None): if callback is not None: self.queue = None self.callback = callback else: self.queue = queue.Queue() self.callback = self.queue.put
def __iter__(self): if not self.capture: raise RuntimeError('Not capturing') # Windows platforms do not have select() for files if os.name == 'nt': q = queue.Queue() def reader(stream): while 1: line = stream.readline() q.put(line) if not line: break t1 = threading.Thread(target=reader, args=(self._cmd.stdout, )) t1.setDaemon(True) t2 = threading.Thread(target=reader, args=(self._cmd.stderr, )) t2.setDaemon(True) t1.start() t2.start() outstanding = 2 while outstanding: item = q.get() if not item: outstanding -= 1 else: yield item.rstrip().decode('utf-8', 'replace') # Otherwise we can go with select() else: streams = [self._cmd.stdout, self._cmd.stderr] while streams: for l in select.select(streams, [], streams): for stream in l: line = stream.readline() if not line: if stream in streams: streams.remove(stream) break yield line.rstrip().decode('utf-8', 'replace')
def __init__(self, num_threads=None): if num_threads is None: num_threads = multiprocessing.cpu_count() self.tasks = queue.Queue(num_threads) for _ in range(num_threads): Worker(self.tasks)