def put(self, item, block=True, timeout=None): # Behaves the same way as default except that instead of raising Full, # it just pushes the item on to the deque anyway, throwing away old # frames. self.not_full.acquire() try: if self.maxsize > 0 and block: if timeout is None: while self._qsize() == self.maxsize: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a non-negative number") else: endtime = Queue._time() + timeout while self._qsize() == self.maxsize: remaining = endtime - Queue._time() if remaining <= 0.0: break self.not_full.wait(remaining) self._put(item) self.unfinished_tasks += 1 self.not_empty.notify() finally: self.not_full.release()