Skip to content

Commit d76d075

Browse files
committed
v3/primitives/queue.py Fix bug with multiple competing get/put tasks.
1 parent d14adb7 commit d76d075

File tree

1 file changed

+4
-3
lines changed

1 file changed

+4
-3
lines changed

v3/primitives/queue.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ def _get(self):
3131
return self._queue.pop(0)
3232

3333
async def get(self): # Usage: item = await queue.get()
34-
if self.empty():
35-
# Queue is empty, put the calling Task on the waiting queue
34+
while self.empty(): # May be multiple tasks waiting on get()
35+
# Queue is empty, suspend task until a put occurs
36+
# 1st of N tasks gets, the rest loop again
3637
self._evput.clear()
3738
await self._evput.wait()
3839
return self._get()
@@ -48,7 +49,7 @@ def _put(self, val):
4849
self._queue.append(val)
4950

5051
async def put(self, val): # Usage: await queue.put(item)
51-
if self.full():
52+
while self.full():
5253
# Queue full
5354
self._evget.clear()
5455
await self._evget.wait()

0 commit comments

Comments
 (0)