Example #1
0
    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)
Example #2
0
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")