python / python/cpython

`asyncio.print_call_graph()` loses the call stack at asynchronous generators

Abierto
#156,980 7 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

stdlib topic-asyncio type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

Bug description:

asyncio.print_call_graph() stops at the first async gen in the await chain and silently drops all of the call stack below it

Repro:

import asyncio

async def deep():
    await asyncio.Event().wait()

async def producer():
    await deep()
    yield 1

async def consumer():
    async for _ in producer():
        pass

async def main():
    t = asyncio.create_task(consumer(), name='consumer')
    await asyncio.sleep(0.05)
    print(asyncio.format_call_graph(t))

asyncio.run(main())

Expected:

* Task(name='consumer', id=0x105be89b0)
  + Call stack:
  |   File '/Users/timofeiivankov/cpython/Lib/asyncio/locks.py', line 210, in async Event.wait()
  |   File '/Users/timofeiivankov/cpython/repro.py', line 4, in async deep()
  |   File '/Users/timofeiivankov/cpython/repro.py', line 7, in async generator producer()
  |   File '/Users/timofeiivankov/cpython/repro.py', line 11, in async consumer()

Actual:

* Task(name='consumer', id=0x105b089b0)
  + Call stack:
  |   File '/Users/timofeiivankov/cpython/repro.py', line 11, in async consumer()

Proposed fix: expose the wrapped generator as ag_gen and step over the wrapper through it

Have a fix ready for that

CPython versions tested on:

CPython main branch

Operating systems tested on:

macOS

Linked PRs
  • gh-156984

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con asyncio.format_call_graph() y el reproductor del issue, incluido el generador asíncrono producer() y la tarea consumidora. Comprueba cómo el grafo de llamadas recorre la cadena de await y compara su salida con la pila esperada. Se considera terminado cuando la salida conserva los frames situados por debajo del generador asíncrono; el PR vinculado gh-156984 indica que el trabajo ya está en marcha.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
devtools
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bien especificado
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.