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 tarefas –
async defdefine uma unidade de trabalho;asyncio.create_task()agenda uma concorrentemente e devolve umaTaskque 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 classeLoopexpõe o restante para os casos raros que precisam dele.Coordenação –
gather()para encaminhamento e convergência,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 gancho do handler de exceções do ciclo.Primitivas de sincronização –
Eventpara sinalização entre coroutines,Lockpara serializar o acesso a um recurso partilhado entre awaits, eThreadSafeFlagpara 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 deawait,__aiter__/__anext__paraasync for, e__aenter__/__aexit__paraasync with.Captura de fotograma – o wrapper que transforma
csi.CSI.snapshot()numa coroutine compatível comawait, para que um ciclo de captura corra a par de outro trabalho asyncio.Armadilhas –
awaits 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.