8. Asyncio

Até agora, todos os scripts do tutorial têm sido sequenciais – uma linha é executada de cada vez, e uma chamada que tem de esperar (uma leitura de sensor, uma viagem de ida e volta pela rede, uma captura de imagem) bloqueia o script até terminar. Isso funciona enquanto há apenas uma coisa a fazer. No momento em que uma aplicação precisa de fazer várias coisas ao mesmo tempo – executar um ciclo de captura de imagem e responder a um comando série, e enviar fotogramas pela rede – um script sequencial fica inoperante. A primeira chamada lenta para tudo o resto.

O módulo asyncio é a resposta do MicroPython. Permite que a aplicação descreva vários trabalhos como coroutines separadas e os execute de forma concorrente numa única thread, cooperativamente – a coroutine que estiver a executar cede o controlo de volta ao escalonador sempre que tiver de esperar. Um ciclo de captura de imagem, um leitor UART e um cliente de rede podem todos existir no mesmo script, e as partes lentas de um já não bloqueiam os outros.

As páginas seguintes cobrem as palavras-chave async/await e o ciclo de vida de Task, a coordenação através de gather() e wait_for(), o cancelamento e a propagação de exceções, as três primitivas de sincronização incorporadas (Event, Lock, ThreadSafeFlag), os ganchos de linguagem para integrar classes de aplicações nos idiomas do asyncio, um pequeno invólucro CSI que permite que snapshot() execute como coroutine, e as armadilhas comuns que acompanham o escalonamento cooperativo.

Primitivas de sincronização

Controlo do loop

Captura de fotogramas

Armadilhas

Conclusão