Geradores assíncronos em Python

Aproveitando Async/Await com geradores para código não bloqueante

Explore geradores assíncronos em Python e aprenda como eles se integram ao asyncio para lidar com operações de E/S assíncronas de maneira eficiente. Entenda quando usar geradores assíncronos e veja exemplos práticos.

Programação
Autor
Afiliação
Data de Publicação

5 de fevereiro de 2024

Data de Modificação

29 de abril de 2025

Palavras-chave

geradores assíncronos Python, Geradores Python asyncio, Tutorial sobre geradores assíncronos, Exemplo de Python assíncrono, código não bloqueante

Introdução

Os geradores assíncronos são uma ferramenta poderosa em Python que permite produzir itens de forma assíncrona usando a sintaxe async e await. Eles permitem que você itere sobre fluxos de dados assíncronos sem bloquear seu aplicativo, tornando-os ideais para tarefas vinculadas a E/S, como comunicação de rede, leitura de arquivos grandes ou processamento de dados em tempo real.



O que são geradores assíncronos?

Os geradores assíncronos são definidos usando a sintaxe async def junto com a palavra-chave yield. Ao contrário dos geradores regulares, os geradores assíncronos pausam sua execução quando encontram uma instrução await. Isso significa que eles podem lidar com operações assíncronas dentro da própria função geradora, fornecendo uma maneira não bloqueante de produzir dados.

Pontos-chave:

  • Execução sem bloqueio:
    Elas permitem que o loop de eventos execute outras tarefas enquanto aguarda a conclusão de uma operação de E/S.
  • Avaliação preguiçosa:
    Os valores são gerados sob demanda, o que conserva memória e melhora o desempenho.
  • Integração com asyncio:
    Geradores assíncronos funcionam perfeitamente com a estrutura asyncio do Python, permitindo uma programação simultânea eficiente.

Exemplo básico de um gerador assíncrono

Abaixo está um exemplo simples que demonstra como criar e usar um gerador assíncrono em Python:

import asyncio

async def async_counter(n):
    """An asynchronous generator that yields numbers from 1 to n with a delay."""
    for i in range(1, n + 1):
        await asyncio.sleep(0.5)  # Simular um atraso vinculado a E/S
        yield i

async def main():
    async for number in async_counter(5):
        print("Count:", number)

if __name__ == "__main__":
    asyncio.run(main())

Explicação:
Neste exemplo, async_counter é um gerador assíncrono que produz números de 1 a n. O await asyncio.sleep(0.5) simula uma operação assíncrona, permitindo que o loop de eventos lide com outras tarefas durante o atraso. O loop async for na função main itera sobre os valores produzidos à medida que eles ficam disponíveis.

Quando usar geradores assíncronos

Geradores assíncronos são particularmente úteis quando:
- Tratamento de operações vinculadas a E/S:
Eles são ideais para cenários em que os dados são recebidos incrementalmente ao longo do tempo, como leitura de um soquete de rede ou processamento de um arquivo grande linha por linha. - Streaming de dados:
Ao lidar com fluxos de dados em tempo real, os geradores assíncronos podem produzir dados com eficiência sem carregar todo o fluxo na memória. - Integração com outras funções assíncronas:
Eles permitem que você crie pipelines de operações assíncronas, integrando-se perfeitamente a outros componentes asyncio.

Práticas recomendadas e considerações

  • Tratamento de erros:
    Use blocos try/except dentro de geradores assíncronos para capturar e lidar com exceções de maneira elegante.
  • Mantenha a modularidade:
    Divida suas tarefas assíncronas em geradores menores e composíveis que podem ser encadeados para fluxos de trabalho complexos.
  • Testar código assíncrono:
    Aproveite as estruturas de teste que suportam código assíncrono (como pytest com pytest-asyncio) para garantir que seus geradores funcionem conforme o esperado.
  • Documente seu código:
    Documente claramente o comportamento dos seus geradores assíncronos para facilitar a manutenção e a compreensão, especialmente ao integrar com sistemas assíncronos maiores.
Dica

Ao começar a usar geradores assíncronos, experimente pequenos exemplos para se familiarizar com a sintaxe async/await antes de integrá-los a aplicativos mais complexos.

Conclusão

Os geradores assíncronos oferecem um método poderoso para lidar com fluxos de dados assíncronos de maneira eficiente. Ao compreender seus fundamentos e integrá-los à estrutura asyncio do Python, você pode escrever código não bloqueante e eficiente em termos de memória que se adapta bem a aplicativos vinculados a E/S. Experimente esses conceitos para ver como eles podem transformar sua abordagem à programação assíncrona.

Leitura adicional

Boa programação e aproveite para explorar a eficiência dos geradores assíncronos em Python!

Explore mais artigos

Nota

Aqui estão mais artigos da mesma categoria para ajudá-lo a se aprofundar no tópico.

placeholder

placeholder
Nenhum item correspondente
De volta ao topo

Reuso

Citação

BibTeX
@online{kassambara2024,
  author = {Kassambara, Alboukadel},
  title = {Geradores assíncronos em Python},
  date = {2024-02-05},
  url = {https://www.datanovia.com/pt/learn/programming/python/advanced/generators/asynchronous-generators.html},
  langid = {pt}
}
Por favor, cite este trabalho como:
Kassambara, Alboukadel. 2024. “Geradores assíncronos em Python.” February 5, 2024. https://www.datanovia.com/pt/learn/programming/python/advanced/generators/asynchronous-generators.html.