From 9aa78566fbeeb8cdaa669ad22f92cf63765f4135 Mon Sep 17 00:00:00 2001 From: Zackery Spytz Date: Wed, 5 Jun 2019 03:33:27 -0600 Subject: bpo-34767: Do not always create a collections.deque() in asyncio.Lock() (GH-13834) https://bugs.python.org/issue34767 --- Lib/asyncio/locks.py | 9 +++++++-- .../NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index d59eb8f..1324eef 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -158,7 +158,7 @@ class Lock(_ContextManagerMixin): """ def __init__(self, *, loop=None): - self._waiters = collections.deque() + self._waiters = None self._locked = False if loop is not None: self._loop = loop @@ -182,10 +182,13 @@ class Lock(_ContextManagerMixin): This method blocks until the lock is unlocked, then sets it to locked and returns True. """ - if not self._locked and all(w.cancelled() for w in self._waiters): + if (not self._locked and (self._waiters is None or + all(w.cancelled() for w in self._waiters))): self._locked = True return True + if self._waiters is None: + self._waiters = collections.deque() fut = self._loop.create_future() self._waiters.append(fut) @@ -224,6 +227,8 @@ class Lock(_ContextManagerMixin): def _wake_up_first(self): """Wake up the first waiter if it isn't done.""" + if not self._waiters: + return try: fut = next(iter(self._waiters)) except StopIteration: diff --git a/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst new file mode 100644 index 0000000..b46bc44 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-06-04-23-44-52.bpo-34767.BpDShN.rst @@ -0,0 +1 @@ +Do not always create a :class:`collections.deque` in :class:`asyncio.Lock`. -- cgit v0.12