unusual behaviour in asyncio.TaskGroup in the presence of GeneratorExit, StopIteration, KeyboardInterrupt and SystemExit
Ouverte
Personne n'a encore pris cette issue.
3.11
3.12
topic-asyncio
type-bug
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 36k
- Merge moyen
- 1 j 9 h
- PR mergées (30 j)
- 558
Description
import gc
import asyncio
import logging
logger = logging.getLogger(__name__)
async def keyboard_interrupt():
raise KeyboardInterrupt
async def system_exit():
raise SystemExit
async def task_groups():
async with asyncio.TaskGroup() as tg:
tg.create_task(system_exit())
tg.create_task(keyboard_interrupt())
loop = asyncio.SelectorEventLoop()
task = loop.create_task(task_groups())
while not task.done():
try:
loop.run_until_complete(asyncio.sleep(0))
except (SystemExit, KeyboardInterrupt) as e:
print(f"{e=}")
print(f"{task=} {task.exception()=}")
loop.close()
print("#######################################################")
async def gen_exit():
async with asyncio.TaskGroup() as tg:
await asyncio.get_running_loop().create_future()
loop = asyncio.SelectorEventLoop()
task = loop.create_task(gen_exit())
loop.run_until_complete(asyncio.sleep(0))
del task
gc.collect()
print("#######################################################")
gives the following output on 3.12:
e=SystemExit()
e=KeyboardInterrupt()
e=SystemExit()
task=<Task finished name='Task-1' coro=<task_groups() done, defined at /home/graingert/projects/cpython/demo.py:14> exception=SystemExit()> task.exception()=SystemExit()
#######################################################
Exception ignored in: <coroutine object gen_exit at 0x7fd62350cd60>
Traceback (most recent call last):
File "/home/graingert/projects/cpython/demo.py", line 37, in gen_exit
async with asyncio.TaskGroup() as tg:
File "/home/graingert/projects/cpython/Lib/asyncio/taskgroups.py", line 134, in __aexit__
raise me from None
BaseExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
Task was destroyed but it is pending!
task: <Task pending name='Task-7' coro=<gen_exit() done, defined at /home/graingert/projects/cpython/demo.py:36> wait_for=<Future pending cb=[Task.task_wakeup()]>>
#######################################################
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Exécutez d’abord le reproducteur Python 3.12 fourni, puis examinez Lib/asyncio/taskgroups.py autour de TaskGroup.aexit et des appels de création de tâches asyncio. Suivez les chemins de GeneratorExit, StopIteration, KeyboardInterrupt et SystemExit et établissez le comportement attendu avant d’ajouter de la couverture ; l’issue ne spécifie pas encore le résultat souhaité.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- À clarifier
- Accessibilité débutants
- 25/100