[Python-3000-checkins] r59958 - in python/branches/py3k: Doc/library/queue.rst Lib/Queue.py Lib/test/test_queue.py Lib/test/test_socket.py Misc/NEWS

raymond.hettinger python-3000-checkins at python.org
Mon Jan 14 22:39:24 CET 2008


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).
 


More information about the Python-3000-checkins mailing list