[issue23812] asyncio.Queue.put_nowait(), followed get() task cancellation leads to item being lost
Gustavo J. A. M. Carneiro
report at bugs.python.org
Mon Mar 30 19:38:52 CEST 2015
Gustavo J. A. M. Carneiro added the comment:
> - Are there other places where a cancellation can have a similar effect? Maybe the same logic in put()?
Hm.. I didn't look, but yes, it does look like it might be affected by the same issue. I'll try to create a test for that to confirm.
> how can the yield-from in get() receive a CancelledError without the waiter being cancelled?
Well, it definitely gets a CancelledError in the return (yield from waiter). I added extensive logging and could confirm this is the case.
What happens is that
1. Test creates a task q.get()
2. The task coroutine, inside Queue.get, blocks on the yield from waiter
3. a couple of items are put in the queue
4. Test code calls task.cancel() (where `task` is running the coroutine q.get)
5. The Queue.get task receives a CancelledError because it was cancelled. The exception appears to come from the `yield from waiter` only because this is the place where the Queue.get task was suspended, but waiter itself is not cancelled.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue23812>
_______________________________________
More information about the Python-bugs-list
mailing list