diff --git a/Lib/threading.py b/Lib/threading.py index 4ebceae7029870..966bc964bf5199 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -8,10 +8,7 @@ from time import monotonic as _time from _weakrefset import WeakSet from itertools import count as _count -try: - from _collections import deque as _deque -except ImportError: - from collections import deque as _deque +from collections import OrderedDict # Note regarding PEP 8 compliant names # This threading model was originally inspired by Java, and inherited @@ -297,7 +294,7 @@ def __init__(self, lock=None): self._acquire_restore = lock._acquire_restore if hasattr(lock, '_is_owned'): self._is_owned = lock._is_owned - self._waiters = _deque() + self._waiters = OrderedDict() def _at_fork_reinit(self): self._lock._at_fork_reinit() @@ -354,7 +351,7 @@ def wait(self, timeout=None): raise RuntimeError("cannot wait on un-acquired lock") waiter = _allocate_lock() waiter.acquire() - self._waiters.append(waiter) + self._waiters[waiter] = None saved_state = self._release_save() gotit = False try: # restore state no matter what (e.g., KeyboardInterrupt) @@ -371,8 +368,8 @@ def wait(self, timeout=None): self._acquire_restore(saved_state) if not gotit: try: - self._waiters.remove(waiter) - except ValueError: + del self._waiters[waiter] + except KeyError: pass def wait_for(self, predicate, timeout=None): @@ -412,7 +409,7 @@ def notify(self, n=1): raise RuntimeError("cannot notify on un-acquired lock") waiters = self._waiters while waiters and n > 0: - waiter = waiters[0] + waiter, _ = waiters.popitem(last=False) try: waiter.release() except RuntimeError: @@ -423,10 +420,6 @@ def notify(self, n=1): pass else: n -= 1 - try: - waiters.remove(waiter) - except ValueError: - pass def notify_all(self): """Wake up all threads waiting on this condition.