def __init__(self, reducers=None, ctx=None, delay=.1): super(DelayedSimpleQueue, self).__init__(reducers=reducers, ctx=ctx) self.out_queue = SimpleQueue(ctx=ctx) self._inner_reader = self._reader self._reader = self.out_queue._reader self._start_thread(delay)
class DelayedSimpleQueue(SimpleQueue): def __init__(self, reducers=None, ctx=None, delay=.1): super(DelayedSimpleQueue, self).__init__(reducers=reducers, ctx=ctx) self.out_queue = SimpleQueue(ctx=ctx) self._inner_reader = self._reader self._reader = self.out_queue._reader self._start_thread(delay) # Overload _start_thread to correctly call our custom _feed def _start_thread(self, delay): self._thread = threading.Thread( target=DelayedSimpleQueue._feed, args=(self._rlock, self._inner_reader, self.out_queue._writer, delay), name='QueueDeFeederThread' ) self._thread.daemon = True self._thread.start() def get(self): return self.out_queue.get() def close(self): self.put(None) self._thread.join() @staticmethod def _feed(readlock, reader, writer, delay): PICKLE_NONE = CustomizableLokyPickler.dumps(None) while True: with readlock: res = reader.recv_bytes() if res == PICKLE_NONE: break time.sleep(delay) writer.send_bytes(res) mp.util.debug("Defeeder clean exit")