8.16. Conclusão

Você percorreu a API do asyncio – as peças que um script precisa para executar vários trabalhos simultaneamente em uma única CPU:

  • Escalonamento cooperativo – o modelo sobre o qual o restante do módulo se apoia. A corrotina em execução tem o loop só para si até que faça await; as trocas só acontecem nesses awaits.

  • Corrotinas e tarefasasync def define uma unidade de trabalho; asyncio.create_task() escalona uma delas simultaneamente e retorna uma Task que a aplicação pode posteriormente aguardar, cancelar ou identificar.

  • O event loop – o motor que executa corrotinas e tarefas. asyncio.run() é o único ponto de entrada de que a maioria dos scripts precisa; a classe Loop expõe o restante para os casos raros que precisam dele.

  • Coordenaçãogather() para distribuição e coleta, 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 hook do handler de exceções do loop.

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

  • Objetos assíncronos personalizados – os hooks da linguagem que permitem que classes da aplicação se integrem aos 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 quadros – o wrapper que transforma csi.CSI.snapshot() em uma corrotina compatível com await, para que um loop de captura seja executado junto com outro trabalho do asyncio.

  • Armadilhasawaits esquecidos, loops apertados sem yields, cancelamentos engolidos, estado compartilhado mutado entre awaits e o restante das armadilhas específicas do asyncio.

Isso é suficiente para escrever programas que combinam trabalho com a câmera, E/S de hardware e trabalho de fundo simultâneo no mesmo loop.

8.16.1. Usando esta referência mais tarde

Trate os capítulos sobre asyncio como material de referência; voltar para consultar o formato de async with ou o comportamento exato de gather() diante da falha de um irmão é o uso pretendido. A página de referência do asyncio lista todas as funções e classes em um só lugar quando a pergunta é 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 helpers no formato de aplicação – 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 grande tópico. asyncio.open_connection(), asyncio.start_server() e a classe Stream são a forma como um script asyncio conversa com o restante da rede de dentro de uma corrotina, junto com os módulos network e socket por baixo. Tudo o que você aprendeu sobre await, Task, cancelamento e as primitivas de sincronização se transfere diretamente.