Occasional incorrect chaining of CancelledError when calling 'cancel' on result of 'asyncio.gather'
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 36k
- PR merge metrics
- PR metrics pending
Description
import asyncio
async def f1():
await asyncio.sleep(1)
async def f2():
return 42
async def main():
# case 1
gfut = asyncio.gather(f1(), f2(), return_exceptions=True)
# case 2
#gfut = asyncio.gather(f2(), f1(), return_exceptions=True)
await asyncio.sleep(0.1)
gfut.cancel("my message")
await gfut
asyncio.run(main())
# case 1
#Traceback (most recent call last):
# File "/Users/vladima/Sources/gather.py", line 14, in main
# print(await gfut)
#asyncio.exceptions.CancelledError
#
#During handling of the above exception, another exception occurred:
#
#Traceback (most recent call last):
# File "/Users/vladima/Sources/gather.py", line 16, in <module>
# asyncio.run(main())
# File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/runners.py", line 44, in run
# return loop.run_until_complete(main)
# File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
# return future.result()
#asyncio.exceptions.CancelledError
# case 2
#Traceback (most recent call last):
# File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/tasks.py", line 605, in sleep
# return await future
#asyncio.exceptions.CancelledError: my message
#During handling of the above exception, another exception occurred:
#Traceback (most recent call last):
# File "/Users/vladima/Sources/gather.py", line 14, in main
# print(await gfut)
#asyncio.exceptions.CancelledError
#
#During handling of the above exception, another exception occurred:
#
#Traceback (most recent call last):
# File "/Users/vladima/Sources/gather.py", line 16, in <module>
# asyncio.run(main())
# File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/runners.py", line 44, in run
# return loop.run_until_complete(main)
# File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete
# return future.result()
#asyncio.exceptions.CancelledError
Currently traceback and description parts of CancelledError depend upon the order of arguments that were passed into asyncio.gather. The reason I believe is this: here fut would be bound to the last item in children which might or might not correspond to the cancelled task and instead it should probably be one of tasks that were actually cancelled (which is still not ideal since there might be many of them but I guess with gather it is as good as it can be).
Linked PRs
- gh-133243
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the two asyncio.gather cases in the issue, then inspect Lib/asyncio/tasks.py around line 812, where the issue identifies the ordering-dependent future selection. Done means cancellation traceback and description behavior no longer depend on the order of gather arguments; review linked PR gh-133243 before starting.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 25/100