Author: raymond.hettinger Date: Mon Jan 14 22:39:24 2008 New Revision: 59958
Modified: python/branches/py3k/Doc/library/queue.rst python/branches/py3k/Lib/Queue.py python/branches/py3k/Lib/test/test_queue.py python/branches/py3k/Lib/test/test_socket.py python/branches/py3k/Misc/NEWS Log: Remove Queue.empty() and Queue.full() in favor of using qsize() or trapping the Empty and Full exceptions. Modified: python/branches/py3k/Doc/library/queue.rst ============================================================================== --- python/branches/py3k/Doc/library/queue.rst (original) +++ python/branches/py3k/Doc/library/queue.rst Mon Jan 14 22:39:24 2008 @@ -53,18 +53,6 @@ this number is not reliable. -.. method:: Queue.empty() - - Return ``True`` if the queue is empty, ``False`` otherwise. Because of - multithreading semantics, this is not reliable. - - -.. method:: Queue.full() - - Return ``True`` if the queue is full, ``False`` otherwise. Because of - multithreading semantics, this is not reliable. - - .. method:: Queue.put(item[, block[, timeout]]) Put *item* into the queue. If optional args *block* is true and *timeout* is Modified: python/branches/py3k/Lib/Queue.py ============================================================================== --- python/branches/py3k/Lib/Queue.py (original) +++ python/branches/py3k/Lib/Queue.py Mon Jan 14 22:39:24 2008 @@ -23,6 +23,7 @@ import threading except ImportError: import dummy_threading as threading + self.maxsize = maxsize self._init(maxsize) # mutex must be held whenever the queue is mutating. All methods # that acquire mutex must release it before returning. mutex @@ -88,20 +89,6 @@ self.mutex.release() return n - def empty(self): - """Return True if the queue is empty, False otherwise (not reliable!).""" - self.mutex.acquire() - n = self._empty() - self.mutex.release() - return n - - def full(self): - """Return True if the queue is full, False otherwise (not reliable!).""" - self.mutex.acquire() - n = self._full() - self.mutex.release() - return n - def put(self, item, block=True, timeout=None): """Put an item into the queue. @@ -116,20 +103,22 @@ self.not_full.acquire() try: if not block: - if self._full(): + if self.maxsize > 0 and self._qsize() == self.maxsize: raise Full elif timeout is None: - while self._full(): - self.not_full.wait() + if self.maxsize > 0: + while self._qsize() == self.maxsize: + self.not_full.wait() else: if timeout < 0: raise ValueError("'timeout' must be a positive number") endtime = _time() + timeout - while self._full(): - remaining = endtime - _time() - if remaining <= 0.0: - raise Full - self.not_full.wait(remaining) + if self.maxsize > 0: + while self._qsize() == self.maxsize: + remaining = endtime - _time() + if remaining <= 0.0: + raise Full + self.not_full.wait(remaining) self._put(item) self.unfinished_tasks += 1 self.not_empty.notify() @@ -158,16 +147,16 @@ self.not_empty.acquire() try: if not block: - if self._empty(): + if not self._qsize(): raise Empty elif timeout is None: - while self._empty(): + while not self._qsize(): self.not_empty.wait() else: if timeout < 0: raise ValueError("'timeout' must be a positive number") endtime = _time() + timeout - while self._empty(): + while not self._qsize(): remaining = endtime - _time() if remaining <= 0.0: raise Empty @@ -192,20 +181,11 @@ # Initialize the queue representation def _init(self, maxsize): - self.maxsize = maxsize self.queue = deque() def _qsize(self): return len(self.queue) - # Check whether the queue is empty - def _empty(self): - return not self.queue - - # Check whether the queue is full - def _full(self): - return self.maxsize > 0 and len(self.queue) == self.maxsize - # Put a new item in the queue def _put(self, item): self.queue.append(item) Modified: python/branches/py3k/Lib/test/test_queue.py ============================================================================== --- python/branches/py3k/Lib/test/test_queue.py (original) +++ python/branches/py3k/Lib/test/test_queue.py Mon Jan 14 22:39:24 2008 @@ -9,6 +9,9 @@ QUEUE_SIZE = 5 +def qfull(q): + return q.maxsize > 0 and q.qsize() == q.maxsize + # A thread to run a function that unclogs a blocked Queue. class _TriggerThread(threading.Thread): def __init__(self, fn, args): @@ -96,7 +99,7 @@ return Queue.Queue._get(self) def FailingQueueTest(q): - if not q.empty(): + if q.qsize(): raise RuntimeError("Call this function with an empty queue") for i in range(QUEUE_SIZE-1): q.put(i) @@ -114,7 +117,7 @@ except FailingQueueException: pass q.put("last") - verify(q.full(), "Queue should be full") + verify(qfull(q), "Queue should be full") # Test a failing blocking put q.fail_next_put = True try: @@ -136,17 +139,17 @@ # Check the Queue isn't damaged. # put failed, but get succeeded - re-add q.put("last") - verify(q.full(), "Queue should be full") + verify(qfull(q), "Queue should be full") q.get() - verify(not q.full(), "Queue should not be full") + verify(not qfull(q), "Queue should not be full") q.put("last") - verify(q.full(), "Queue should be full") + verify(qfull(q), "Queue should be full") # Test a blocking put _doBlockingTest( q.put, ("full",), q.get, ()) # Empty it for i in range(QUEUE_SIZE): q.get() - verify(q.empty(), "Queue should be empty") + verify(not q.qsize(), "Queue should be empty") q.put("first") q.fail_next_get = True try: @@ -154,16 +157,16 @@ raise TestFailed("The queue didn't fail when it should have") except FailingQueueException: pass - verify(not q.empty(), "Queue should not be empty") + verify(q.qsize(), "Queue should not be empty") q.fail_next_get = True try: q.get(timeout=0.1) raise TestFailed("The queue didn't fail when it should have") except FailingQueueException: pass - verify(not q.empty(), "Queue should not be empty") + verify(q.qsize(), "Queue should not be empty") q.get() - verify(q.empty(), "Queue should be empty") + verify(not q.qsize(), "Queue should be empty") q.fail_next_get = True try: _doExceptionalBlockingTest(q.get, (), q.put, ('empty',), @@ -172,12 +175,12 @@ except FailingQueueException: pass # put succeeded, but get failed. - verify(not q.empty(), "Queue should not be empty") + verify(q.qsize(), "Queue should not be empty") q.get() - verify(q.empty(), "Queue should be empty") + verify(not q.qsize(), "Queue should be empty") def SimpleQueueTest(q): - if not q.empty(): + if q.qsize(): raise RuntimeError("Call this function with an empty queue") # I guess we better check things actually queue correctly a little :) q.put(111) @@ -186,10 +189,10 @@ "Didn't seem to queue the correct data!") for i in range(QUEUE_SIZE-1): q.put(i) - verify(not q.empty(), "Queue should not be empty") - verify(not q.full(), "Queue should not be full") + verify(q.qsize(), "Queue should not be empty") + verify(not qfull(q), "Queue should not be full") q.put("last") - verify(q.full(), "Queue should be full") + verify(qfull(q), "Queue should be full") try: q.put("full", block=0) raise TestFailed("Didn't appear to block with a full queue") @@ -206,7 +209,7 @@ # Empty it for i in range(QUEUE_SIZE): q.get() - verify(q.empty(), "Queue should be empty") + verify(not q.qsize(), "Queue should be empty") try: q.get(block=0) raise TestFailed("Didn't appear to block with an empty queue") Modified: python/branches/py3k/Lib/test/test_socket.py ============================================================================== --- python/branches/py3k/Lib/test/test_socket.py (original) +++ python/branches/py3k/Lib/test/test_socket.py Mon Jan 14 22:39:24 2008 @@ -118,7 +118,7 @@ self.__tearDown() self.done.wait() - if not self.queue.empty(): + if self.queue.qsize(): msg = self.queue.get() self.fail(msg) Modified: python/branches/py3k/Misc/NEWS ============================================================================== --- python/branches/py3k/Misc/NEWS (original) +++ python/branches/py3k/Misc/NEWS Mon Jan 14 22:39:24 2008 @@ -352,6 +352,9 @@ Library ------- +- Removed Queue.empty() and Queue.full(). Instead use Queue.qsize() or + trap the Empty and Full exceptions. + - Removed defunct parts of the random module (the Wichmann-Hill generator and the jumpahead() method). _______________________________________________ Python-3000-checkins mailing list Python-3000-checkins@python.org http://mail.python.org/mailman/listinfo/python-3000-checkins