Occasional incorrect chaining of CancelledError when calling 'cancel' on result of 'asyncio.gather'
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 77.2k
- Fork
- 36k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia eseguendo i due casi di asyncio.gather nell’issue, quindi ispeziona Lib/asyncio/tasks.py intorno alla riga 812, dove l’issue identifica la selezione del future dipendente dall’ordine. Il lavoro è completato quando il comportamento del traceback di cancellazione e della descrizione non dipende più dall’ordine degli argomenti di gather; esamina il PR collegato gh-133243 prima di iniziare.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- backend
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 25/100