8. Asyncio¶
Até aqui, cada script do tutorial foi sequencial – uma linha é executada por vez, e uma chamada que precisa esperar (uma leitura de sensor, uma ida e volta de rede, um snapshot) bloqueia o script até terminar. Isso funciona enquanto há apenas uma coisa a fazer. No momento em que uma aplicação precisa fazer várias coisas ao mesmo tempo – executar um laço de snapshot e responder a um comando serial e enviar quadros pela rede – um script sequencial desmorona. A primeira chamada lenta impede que tudo o mais avance.
O módulo asyncio é a resposta do MicroPython. Ele permite que a aplicação descreva várias tarefas como corrotinas separadas e as execute concorrentemente em uma única thread, de forma cooperativa – a corrotina que estiver em execução cede o controle de volta ao escalonador sempre que precisa esperar. Um laço de snapshot, um leitor de UART e um cliente de rede podem todos viver no mesmo script, e as partes lentas de um não mais congelam os outros.
As páginas a seguir cobrem as palavras-chave async/await e o ciclo de vida de Task, a coordenação por meio de gather() e wait_for(), o cancelamento e a propagação de exceções, as três primitivas de sincronização embutidas (Event, Lock, ThreadSafeFlag), os ganchos de linguagem para encaixar classes da aplicação nos idiomas do asyncio, um pequeno invólucro CSI que permite que snapshot() seja executado como uma corrotina, e as armadilhas comuns que acompanham o escalonamento cooperativo.
Coordenação
Primitivas de sincronização
Objetos assíncronos personalizados
Controle do loop
Captura de quadros
Armadilhas
Encerramento