diff options
author | Jesse Noller <jnoller@gmail.com> | 2009-08-06 02:05:56 +0000 |
---|---|---|
committer | Jesse Noller <jnoller@gmail.com> | 2009-08-06 02:05:56 +0000 |
commit | 8497efeb4064be366a76e50a8650ed4b6dd3fd01 (patch) | |
tree | 570fa25975a876863aac029763288b4b7eef61ec | |
parent | 175e0bf8ca4934fd4f360cc403e209b671a162a9 (diff) | |
download | cpython-git-8497efeb4064be366a76e50a8650ed4b6dd3fd01.tar.gz |
Fix issue 4660: spurious task_done errors in multiprocessing, remove doc note for from_address
-rw-r--r-- | Doc/library/multiprocessing.rst | 5 | ||||
-rw-r--r-- | Lib/multiprocessing/queues.py | 19 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 20 insertions, 8 deletions
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 9e53aa5635..66c73a146b 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1153,11 +1153,6 @@ their parent process exits. The manager classes are defined in the Run the server in the current process. - .. method:: from_address(address, authkey) - - A class method which creates a manager object referring to a pre-existing - server process which is using the given address and authentication key. - .. method:: get_server() Returns a :class:`Server` object which represents the actual server under diff --git a/Lib/multiprocessing/queues.py b/Lib/multiprocessing/queues.py index 5df58825b5..ea279911b6 100644 --- a/Lib/multiprocessing/queues.py +++ b/Lib/multiprocessing/queues.py @@ -282,9 +282,22 @@ class JoinableQueue(Queue): Queue.__setstate__(self, state[:-2]) self._cond, self._unfinished_tasks = state[-2:] - def put(self, item, block=True, timeout=None): - Queue.put(self, item, block, timeout) - self._unfinished_tasks.release() + def put(self, obj, block=True, timeout=None): + assert not self._closed + if not self._sem.acquire(block, timeout): + raise Full + + self._notempty.acquire() + self._cond.acquire() + try: + if self._thread is None: + self._start_thread() + self._buffer.append(obj) + self._unfinished_tasks.release() + self._notempty.notify() + finally: + self._cond.release() + self._notempty.release() def task_done(self): self._cond.acquire() @@ -485,6 +485,7 @@ Craig McPheeters Lambert Meertens Bill van Melle Lucas Prado Melo +Brian Merrell Luke Mewburn Mike Meyer Steven Miale @@ -354,6 +354,9 @@ Core and Builtins Library ------- +- Issue #4660: If a multiprocessing.JoinableQueue.put() was preempted, it was + possible to get a spurious 'task_done() called too many times' error. + - Issue #6595: The Decimal constructor now allows arbitrary Unicode decimal digits in input, as recommended by the standard. Previously it was restricted to accepting [0-9]. |