Message370855
It seems like the future subclass returned by asyncio.gather() (_GatheringFuture) can never return True for future.cancelled() even after it's cancel() has been invoked successfully (returning True) and an await on it actually raised a CancelledError. This is in contrast to the behavior of normal Futures and it seems generally to be classified as a minor bug by developers.
* Stackoverflow Post: https://stackoverflow.com/questions/61942306/asyncio-gather-task-cancelled-is-false-after-task-cancel
* Github snippet: https://gist.github.com/timmwagener/dfed038dc2081c8b5a770e175ba3756b
I have created a fix and will create a PR. It seemed rather easy to fix and the asyncio test suite still succeeds. So maybe this is a minor bug, whose fix has no backward-compatibility consequences. However, my understanding is that asyncio.gather() is scheduled for deprecation, so maybe changes in this area are on halt anyways!?
----
# excerpt from snippet
async def main():
"""Cancel a gather() future and child and return it."""
task_child = ensure_future(sleep(1.0))
future_gather = gather(task_child)
future_gather.cancel()
try:
await future_gather
except CancelledError:
pass
return future_gather, task_child
# run
future_gather, task_child = run(main())
# log gather state
logger.info(future_gather.cancelled()) # False / UNEXPECTED / ASSUMED BUG
logger.info(future_gather.done()) # True
logger.info(future_gather.exception()) # CancelledError
logger.info(future_gather._state) # FINISHED
# log child state
logger.info(task_child.cancelled()) # True
logger.info(task_child.done()) # True
# logger.info(task_child.exception()) Raises because _state is CANCELLED
logger.info(task_child._state) # CANCELLED |
|
Date |
User |
Action |
Args |
2020-06-06 22:13:51 | timmwagener | set | recipients:
+ timmwagener, asvetlov, yselivanov |
2020-06-06 22:13:51 | timmwagener | set | messageid: <1591481631.01.0.634103349075.issue40894@roundup.psfhosted.org> |
2020-06-06 22:13:50 | timmwagener | link | issue40894 messages |
2020-06-06 22:13:50 | timmwagener | create | |
|