Skip to content
Permalink
Browse files

bpo-31620: have asyncio/queues not leak memory when you've exceptions…

… during waiting (GH-3813) (#4326)

(cherry picked from commit c62f0cb)
  • Loading branch information
miss-islington authored and asvetlov committed Nov 7, 2017
1 parent 64f1049 commit ac4f6d4448fb6f9affb817bafb8357450fe43349
@@ -167,6 +167,12 @@ def get(self):
yield from getter
except:
getter.cancel() # Just in case getter is not done yet.

try:
self._getters.remove(getter)
except ValueError:
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.
@@ -295,6 +295,23 @@ def producer(queue, num_items):
loop=self.loop),
)

def test_cancelled_getters_not_being_held_in_self_getters(self):
def a_generator():
yield 0.1
yield 0.2

self.loop = self.new_test_loop(a_generator)
@asyncio.coroutine
def consumer(queue):
try:
item = yield from asyncio.wait_for(queue.get(), 0.1, loop=self.loop)
except asyncio.TimeoutError:
pass

queue = asyncio.Queue(loop=self.loop, maxsize=5)
self.loop.run_until_complete(self.loop.create_task(consumer(queue)))
self.assertEqual(len(queue._getters), 0)


class QueuePutTests(_QueueTestBase):

@@ -0,0 +1,2 @@
an empty asyncio.Queue now doesn't leak memory when queue.get pollers
timeout

0 comments on commit ac4f6d4

Please sign in to comment.
You can’t perform that action at this time.