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.