Kaydet (Commit) ec4b174d authored tarafından Raymond Hettinger's avatar Raymond Hettinger

Issue #17385: Fix quadratic behavior in threading.Condition

üst 720da571
...@@ -10,6 +10,12 @@ except ImportError: ...@@ -10,6 +10,12 @@ except ImportError:
from time import time as _time from time import time as _time
from traceback import format_exc as _format_exc from traceback import format_exc as _format_exc
from _weakrefset import WeakSet from _weakrefset import WeakSet
try:
from _itertools import islice as _slice
from _collections import deque as _deque
except ImportError:
from itertools import islice as _islice
from collections import deque as _deque
# Note regarding PEP 8 compliant names # Note regarding PEP 8 compliant names
# This threading model was originally inspired by Java, and inherited # This threading model was originally inspired by Java, and inherited
...@@ -146,7 +152,7 @@ class Condition: ...@@ -146,7 +152,7 @@ class Condition:
self._is_owned = lock._is_owned self._is_owned = lock._is_owned
except AttributeError: except AttributeError:
pass pass
self._waiters = [] self._waiters = _deque()
def __enter__(self): def __enter__(self):
return self._lock.__enter__() return self._lock.__enter__()
...@@ -217,7 +223,7 @@ class Condition: ...@@ -217,7 +223,7 @@ class Condition:
if not self._is_owned(): if not self._is_owned():
raise RuntimeError("cannot notify on un-acquired lock") raise RuntimeError("cannot notify on un-acquired lock")
__waiters = self._waiters __waiters = self._waiters
waiters = __waiters[:n] waiters = _deque(_islice(__waiters, n))
if not waiters: if not waiters:
return return
for waiter in waiters: for waiter in waiters:
......
...@@ -277,6 +277,9 @@ Core and Builtins ...@@ -277,6 +277,9 @@ Core and Builtins
Library Library
------- -------
_ Issue #17385: Fix quadratic behavior in threading.Condition. The FIFO
queue now uses a deque instead of a list.
- Issue #14645: The email generator classes now produce output using the - Issue #14645: The email generator classes now produce output using the
specified linesep throughout. Previously if the prolog, epilog, or specified linesep throughout. Previously if the prolog, epilog, or
body were stored with a different linesep, that linesep was used. This body were stored with a different linesep, that linesep was used. This
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment