asyncio — agendador de E/S assíncrona¶
Este módulo fornece um agendador de multitarefa cooperativa para corrotinas async/await, juntamente com primitivas para sincronização (locks, events) e rede TCP não bloqueante por meio de stream readers e writers. As tarefas são executadas concorrentemente em um único loop de eventos; a tarefa em execução cede o controle de volta ao loop com await.
Exemplo:
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(10_000)
# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))
Funções principais¶
- asyncio.create_task(coro: Coroutine) Task¶
Cria uma nova tarefa a partir da corrotina fornecida e a agenda para execução.
Retorna o objeto
Taskcorrespondente.
- asyncio.run(coro: Coroutine) Any¶
Cria uma nova tarefa a partir da corrotina fornecida e a executa até que ela seja concluída.
Retorna o valor retornado por coro.
Funções adicionais¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
Aguarda a conclusão do awaitable, mas o cancela se ele demorar mais do que timeout segundos. Se awaitable não for uma tarefa, uma tarefa será criada a partir dele.
Se ocorrer um timeout, a tarefa é cancelada e
asyncio.TimeoutErroré levantada: isso deve ser tratado pelo chamador. A tarefa recebeasyncio.CancelledError, que pode ser ignorada ou tratada usandotry...exceptoutry...finallypara executar código de limpeza.Retorna o valor de retorno de awaitable.
Esta é uma corrotina.
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
Semelhante a
wait_for(), mas timeout é um inteiro em milissegundos.Esta é uma corrotina e uma extensão do MicroPython.
class Task¶
- class asyncio.Task¶
Este objeto envolve uma corrotina em uma tarefa em execução. É possível aguardar tarefas usando
await task, o que aguardará a conclusão da tarefa e retornará o valor de retorno dela.As tarefas não devem ser criadas diretamente; em vez disso, use
create_task()para criá-las.
class Event¶
- class asyncio.Event¶
Cria um novo event que pode ser usado para sincronizar tarefas. Os events começam no estado limpo (cleared).
- set() None¶
Define o event. Quaisquer tarefas aguardando o event serão agendadas para execução.
Nota: isto deve ser chamado de dentro de uma tarefa. Não é seguro chamá-lo a partir de uma IRQ, de um callback do agendador ou de outra thread. Veja
ThreadSafeFlag.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
Cria um novo flag que pode ser usado para sincronizar uma tarefa com código que executa fora do loop do asyncio, como outras threads, IRQs ou callbacks do agendador. Os flags começam no estado limpo (cleared).
class Lock¶
- class asyncio.Lock¶
Cria um novo lock que pode ser usado para coordenar tarefas. Os locks começam no estado desbloqueado (unlocked).
Além dos métodos abaixo, os locks podem ser usados em uma instrução
async with.
Conexões de stream TCP¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
Abre uma conexão TCP para o host e a port fornecidos. O endereço host será resolvido usando
socket.getaddrinfo(), que atualmente é uma chamada bloqueante. Se ssl for um objetossl.SSLContext, esse contexto é usado para criar o transporte; se ssl forTrue, um contexto padrão é usado.Retorna um par de streams: um stream de leitura (reader) e um de escrita (writer). Levantará um
OSErrorespecífico de socket se o host não puder ser resolvido ou se a conexão não puder ser estabelecida.Esta é uma corrotina.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
Inicia um servidor TCP no host e na port fornecidos. O callback será chamado para conexões aceitas e recebidas, e receberá 2 argumentos: os streams de leitura (reader) e de escrita (writer) da conexão.
Se ssl for um objeto
ssl.SSLContext, esse contexto é usado para criar o transporte.Retorna um objeto
Server.Esta é uma corrotina.
- class asyncio.Stream¶
Isto representa uma conexão de stream TCP. Para minimizar o código, esta classe implementa tanto um reader quanto um writer, e tanto
StreamReaderquantoStreamWritersão apelidos (alias) para esta classe.- get_extra_info(v: str) Any¶
Obtém informações extras sobre o stream, dadas por v. Os valores válidos para v são:
peername.
- read(n: int = -1) bytes¶
Lê até n bytes e os retorna. Se n não for fornecido ou for -1, lê todos os bytes até EOF. O valor retornado será um objeto bytes vazio se EOF for encontrado antes que algum byte seja lido.
Esta é uma corrotina.
- readinto(buf: bytearray | memoryview) int¶
Lê até n bytes em buf, sendo n igual ao comprimento de buf.
Retorna o número de bytes lidos em buf.
Esta é uma corrotina e uma extensão do MicroPython.
- readexactly(n: int) bytes¶
Lê exatamente n bytes e os retorna como um objeto bytes.
Levanta uma exceção
EOFErrorse o stream terminar antes de ler n bytes.Esta é uma corrotina.
- write(buf: bytes) None¶
Acumula buf no buffer de saída. Os dados só são descarregados quando
Stream.drain()é chamado. Recomenda-se chamarStream.drain()imediatamente após chamar esta função.
Loop de Eventos¶
- asyncio.get_event_loop() Loop¶
Retorna o loop de eventos usado para agendar e executar tarefas. Veja
Loop.
- asyncio.new_event_loop() Loop¶
Redefine o loop de eventos e o retorna.
Nota: como o MicroPython possui apenas um único loop de eventos, esta função apenas redefine o estado do loop, não criando um novo.
- class asyncio.Loop¶
Isto representa o objeto que agenda e executa tarefas. Ele não pode ser criado; use
get_event_loop()em vez disso.- create_task(coro: Coroutine) Task¶
Cria uma tarefa a partir do coro fornecido e retorna o novo objeto
Task.
- run_until_complete(awaitable: Awaitable) Any¶
Executa o awaitable fornecido até que ele seja concluído. Se awaitable não for uma tarefa, ele será promovido a uma.
- set_exception_handler(handler: Callable) None¶
Define o manipulador de exceções a ser chamado quando uma Task levantar uma exceção que não seja capturada. O handler deve aceitar dois argumentos:
(loop, context).