python / python/cpython

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

Aberta
#156,980 7 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

stdlib topic-asyncio type-bug
Linguagem predominante
Python
Estrelas
77.2k
Forks
35.9k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

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

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece com asyncio.format_call_graph() e o reproducer na issue, incluindo o gerador assíncrono producer() e a tarefa consumidora. Verifique como o grafo de chamadas percorre a cadeia de await e compare sua saída com a pilha esperada. Considera-se concluído quando a saída retiver os frames abaixo do gerador assíncrono; o PR vinculado gh-156984 indica que o trabalho já está em andamento.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
devtools
Tipo de issue
Bug
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Claramente especificada
Facilidade para iniciantes
25/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.