bpo-32574: Fix leaks in asyncio.Queue.put() and .get() (#5208)

This commit is contained in:
José Melero Fernández 2018-01-25 23:45:43 +00:00 committed by Yury Selivanov
parent c9070d03f5
commit c47dacb690
3 changed files with 63 additions and 2 deletions

View file

@ -121,6 +121,13 @@ class Queue:
await putter
except:
putter.cancel() # Just in case putter is not done yet.
try:
# Clean self._putters from canceled putters.
self._putters.remove(putter)
except ValueError:
# The putter could be removed from self._putters by a
# previous get_nowait call.
pass
if not self.full() and not putter.cancelled():
# We were woken up by get_nowait(), but can't take
# the call. Wake up the next in line.
@ -152,12 +159,13 @@ class Queue:
await getter
except:
getter.cancel() # Just in case getter is not done yet.
try:
# Clean self._getters from canceled getters.
self._getters.remove(getter)
except ValueError:
# The getter could be removed from self._getters by a
# previous put_nowait call.
pass
if not self.empty() and not getter.cancelled():
# We were woken up by put_nowait(), but can't take
# the call. Wake up the next in line.