8.16. Conclusão

Percorreu a API do asyncio – as peças que um script necessita para correr vários trabalhos concorrentemente num único CPU:

  • Agendamento cooperativo – o modelo em que o resto do módulo assenta. A coroutine em execução tem o ciclo para si própria até fazer await; as trocas acontecem apenas nesses awaits.

  • Coroutines e tarefasasync def define uma unidade de trabalho; asyncio.create_task() agenda uma concorrentemente e devolve uma Task que a aplicação pode posteriormente aguardar, cancelar ou identificar.

  • O ciclo de eventos – o motor que corre coroutines e tarefas. asyncio.run() é o único ponto de entrada que a maioria dos scripts necessita; a classe Loop expõe o restante para os casos raros que precisam dele.

  • Coordenaçãogather() para encaminhamento e convergência, wait_for() para prazos, Task.cancel e o padrão de limpeza com cláusula finally, propagação de exceções através de tarefas e chamadas gather, e o gancho do handler de exceções do ciclo.

  • Primitivas de sincronizaçãoEvent para sinalização entre coroutines, Lock para serializar o acesso a um recurso partilhado entre awaits, e ThreadSafeFlag para acordar uma tarefa asyncio a partir de um handler de interrupção.

  • Objetos async personalizados – os ganchos da linguagem que permitem que classes da aplicação se integrem nos idiomas do asyncio. __await__ para objetos que são eles próprios o alvo de await, __aiter__ / __anext__ para async for, e __aenter__ / __aexit__ para async with.

  • Captura de fotograma – o wrapper que transforma csi.CSI.snapshot() numa coroutine compatível com await, para que um ciclo de captura corra a par de outro trabalho asyncio.

  • Armadilhasawaits esquecidos, ciclos apertados sem cedências, cancelamentos engolidos, estado partilhado mutado entre awaits, e o resto das armadilhas específicas do asyncio.

Isso é suficiente para escrever programas que combinam trabalho com câmara, I/O de hardware e trabalho em segundo plano concorrente no mesmo ciclo.

8.16.1. Utilizar esta referência mais tarde

Trate os capítulos do asyncio como material de referência; voltar para consultar a forma de async with ou o comportamento exato de gather() numa falha de um irmão é o uso pretendido. A página de referência asyncio lista todas as funções e classes num único local quando a questão é apenas «qual é o nome exato desta chamada».

Para primitivas mais ricas construídas sobre o módulo – semáforos, filas, barreiras e uma coleção substancial de auxiliares moldados para aplicações – o repositório peterhinch/micropython-async é a fonte padrão mantida pela comunidade.

8.16.2. Para onde ir a partir daqui

Rede é o próximo tópico principal. asyncio.open_connection(), asyncio.start_server() e a classe Stream são como um script asyncio fala com o resto da rede de dentro de uma coroutine, juntamente com os módulos network e socket por baixo. Tudo o que aprendeu sobre await, Task, cancelamento e as primitivas de sincronização aplica-se diretamente.