3 pontos por GN⁺ 2024-05-09 | Ainda não há comentários. | Compartilhar no WhatsApp
  • asyncio é uma boa forma de lidar com programas I/O-bound em Python e, essencialmente, fornece uma boa camada sobre os Generators do Python
  • Generators tornam o código mais eficiente em memória e permitem pausar e retomar funções com a palavra-chave yield
  • Com yield from, um generator pode chamar um sub-generator ou um objeto iterável, criando uma cadeia de generators

Loop de eventos

  • O núcleo do asyncio é o event loop, que executa e gerencia a task atual
  • O event loop percorre repetidamente uma lista de tasks e executa cada uma com next(task)
  • Durante operações de I/O, uma task usa yield para pausar a execução e devolver o controle ao event loop

Dormindo

  • Com yield from, é possível adicionar um sub-generator a uma task
  • Ao adicionar um generator de sleep, a execução da task pode ser pausada até o tempo especificado
  • Quando o sleep sai do loop while, ocorre a exceção StopIteration, e o yield from da função task continua para a próxima linha de código

De Yield para Await

  • É possível fazer a transição de yield para await usando o método dunder __await__ e a palavra-chave async
  • A palavra-chave await pode chamar o método __await__ de uma instância de classe ou ser usada em uma coroutine (objeto criado por uma função async)
  • A palavra-chave await pode ser vista como um sinônimo de yield from, com algumas regras extras de validação
  • É possível criar uma classe Task própria, implementar o método __await__ e adicionar ao event loop as tasks criadas com a função create_task
  • O gerenciador do event loop executa as tasks e as marca como concluídas quando ocorre a exceção StopIteration
  • A função sleep também precisa ser modificada para ser compatível com async

AsyncIO e Await

  • No código acima, trocar "jacobio" por "asyncio" resulta no uso completo do pacote asyncio
  • O asyncio faz muito mais, mas é possível recriar do zero sua parte central a partir de generators básicos
  • No pacote real asyncio, funções como asyncio.gather() podem ser usadas para lidar com várias tasks

Opinião do GN⁺

  • O texto explica de forma simples como o asyncio funciona usando generators, o que deve ajudar bastante desenvolvedores que estão tendo o primeiro contato com asyncio
  • asyncio é uma biblioteca otimizada para processamento de I/O de alto desempenho, e entender sua estrutura interna por meio deste texto pode ajudar a utilizá-la de forma mais eficaz em projetos reais
  • Ainda assim, o asyncio real tem uma estrutura muito mais complexa, então, para uso profissional, provavelmente será necessário um estudo mais aprofundado com a documentação oficial e outras fontes
  • Outras bibliotecas com funcionalidades semelhantes ao asyncio, como Trio e Curio, também podem render uma comparação interessante
  • Ao adotar asyncio, há muitos pontos a considerar, como compatibilidade com código síncrono existente, tratamento de erros e testes, então será necessária uma análise e preparação cuidadosas

Ainda não há comentários.

Ainda não há comentários.