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 tarefas –
async defdefine uma unidade de trabalho;asyncio.create_task()escalona uma delas simultaneamente e retorna umaTaskque 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 classeLoopexpõe o restante para os casos raros que precisam dele.Coordenação –
gather()para distribuição e coleta,wait_for()para prazos,Task.cancele o padrão de limpeza com cláusulafinally, 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ção –
Eventpara sinalização entre corrotinas,Lockpara serializar o acesso a um recurso compartilhado entre awaits, eThreadSafeFlagpara 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 deawait,__aiter__/__anext__paraasync for, e__aenter__/__aexit__paraasync with.Captura de quadros – o wrapper que transforma
csi.CSI.snapshot()em uma corrotina compatível comawait, para que um loop de captura seja executado junto com outro trabalho do asyncio.Armadilhas –
awaits 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.