def put(self, item, block=True, timeout=None): """reference to Queue.Queue""" self.not_full.acquire() try: if self.maxsize > 0: if not block: if self._qsize() == self.maxsize: raise Full elif timeout is None: while self._qsize() == self.maxsize: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a positive number") else: endtime = _time() + timeout while self._qsize() == self.maxsize: remaining = endtime - _time() if remaining <= 0.0: raise Full self.not_full.wait(remaining) task_id = self._put(item) self.unfinished_tasks += 1 self.not_empty.notify() finally: self.not_full.release() return task_id
def get(self, block=True, timeout=None): """Remove and return an item from the queue. Works as does `Queue.Queue.get` except that a `get` on a closed queue will raise `Closed`. Similarly, a blocked `get` will raise `Closed` if the queue is closed during the block. """ self.not_empty.acquire() try: if not block: if not self._qsize() and not self._closed: raise Empty elif timeout is None: while not self._qsize() and not self._closed: self.not_empty.wait() elif timeout < 0: raise ValueError("'timeout' must be a positive number") else: endtime = _time() + timeout while not self._qsize() and not self._closed: remaining = endtime - _time() if remaining <= 0.0: raise Empty self.not_empty.wait(remaining) if self._closed and not self._qsize(): raise Closed item = self._get() self.not_full.notify() return item finally: self.not_empty.release()
def put(self, item, block=True, timeout=None, last=False): """Put an item into the queue. Works as does `Queue.Queue.put`, but with these differences: If the queue is closed, raises Closed. If `last` is True and the put succeeds, the queue will be atomically closed. Also raises `Closed` in the event that the queue is closed while the `put` is blocked. """ self.not_full.acquire() try: if self.maxsize > 0: if not block: if self._qsize() == self.maxsize and not self._closed: raise Full elif timeout is None: while self._qsize( ) == self.maxsize and not self._closed: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a positive number") else: endtime = _time() + timeout while self._qsize( ) == self.maxsize and not self._closed: remaining = endtime - _time() if remaining <= 0.0: raise Full self.not_full.wait(remaining) if self._closed: raise Closed self._put(item) self.unfinished_tasks += 1 if last: self._closed = True self.not_empty.notify_all() self.not_full.notify_all() else: self.not_empty.notify() finally: self.not_full.release()
def put(self, item, block=True, timeout=None, last=False): """Put an item into the queue. Works as does `Queue.Queue.put`, but with these differences: If the queue is closed, raises Closed. If `last` is True and the put succeeds, the queue will be atomically closed. Also raises `Closed` in the event that the queue is closed while the `put` is blocked. """ self.not_full.acquire() try: if self.maxsize > 0: if not block: if self._qsize() == self.maxsize and not self._closed: raise Full elif timeout is None: while self._qsize() == self.maxsize and not self._closed: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a positive number") else: endtime = _time() + timeout while self._qsize() == self.maxsize and not self._closed: remaining = endtime - _time() if remaining <= 0.0: raise Full self.not_full.wait(remaining) if self._closed: raise Closed self._put(item) self.unfinished_tasks += 1 if last: self._closed = True self.not_empty.notify_all() self.not_full.notify_all() else: self.not_empty.notify() finally: self.not_full.release()