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 Task correspondente.

asyncio.current_task() Task#

Retorna o objeto Task associado à tarefa atualmente em execução.

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.

asyncio.sleep(t: float) None#

Dorme por t segundos (pode ser um float).

Esta é uma corrotina.

asyncio.sleep_ms(t: int) None#

Dorme por t milissegundos.

Esta é uma corrotina e uma extensão do MicroPython.

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 recebe asyncio.CancelledError, que pode ser ignorada ou tratada usando try...except ou try...finally para 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.

asyncio.gather(*awaitables, return_exceptions: bool = False) List#

Executa todos os awaitables concorrentemente. Quaisquer awaitables que não sejam tarefas são promovidos a tarefas.

Retorna uma lista com os valores de retorno de todos os awaitables.

Esta é uma corrotina.

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.

cancel() None#

Cancela a tarefa injetando asyncio.CancelledError nela. A tarefa pode ignorar essa exceção. Código de limpeza pode ser executado ao tratá-la ou por meio de try ... finally.

class Event#

class asyncio.Event#

Cria um novo event que pode ser usado para sincronizar tarefas. Os events começam no estado limpo (cleared).

is_set() bool#

Retorna True se o event estiver definido (set), False caso contrário.

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.

clear() None#

Limpa o event.

wait() None#

Aguarda o event ser definido. Se o event já estiver definido, retorna imediatamente.

Esta é uma corrotina.

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).

set() None#

Define o flag. Se houver uma tarefa aguardando o flag, ela será agendada para execução.

clear() None#

Limpa o flag. Isso pode ser usado para garantir que um flag possivelmente definido anteriormente esteja limpo antes de aguardá-lo.

wait() None#

Aguarda o flag ser definido. Se o flag já estiver definido, retorna imediatamente. O flag é automaticamente redefinido ao retornar de wait.

Um flag só pode ser aguardado por uma única tarefa de cada vez.

Esta é uma corrotina.

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.

locked() bool#

Retorna True se o lock estiver bloqueado, caso contrário False.

acquire() bool#

Aguarda o lock estar no estado desbloqueado e então o bloqueia de forma atômica. Apenas uma tarefa pode adquirir o lock por vez.

Esta é uma corrotina.

release() None#

Libera o lock. Se houver tarefas aguardando o lock, a próxima na fila é agendada para execução e o lock permanece bloqueado. Caso contrário, não há tarefas aguardando e o lock fica desbloqueado.

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 objeto ssl.SSLContext, esse contexto é usado para criar o transporte; se ssl for True, um contexto padrão é usado.

Retorna um par de streams: um stream de leitura (reader) e um de escrita (writer). Levantará um OSError especí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 StreamReader quanto StreamWriter sã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.

close() None#

Fecha o stream.

wait_closed() None#

Aguarda o stream ser fechado.

Esta é uma corrotina.

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 EOFError se o stream terminar antes de ler n bytes.

Esta é uma corrotina.

readline() bytes#

Lê uma linha e a retorna.

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 chamar Stream.drain() imediatamente após chamar esta função.

drain() None#

Descarrega (escreve) todos os dados de saída em buffer para o stream.

Esta é uma corrotina.

class asyncio.Server#

Isto representa a classe de servidor retornada por start_server(). Ela pode ser usada em uma instrução async with para fechar o servidor ao sair.

close() None#

Fecha o servidor.

wait_closed() None#

Aguarda o servidor ser fechado.

Esta é uma corrotina.

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_forever() None#

Executa o loop de eventos até que stop() seja chamado.

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.

stop() None#

Para o loop de eventos.

close() None#

Fecha o loop de eventos.

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).

get_exception_handler() Callable | None#

Obtém o manipulador de exceções atual. Retorna o manipulador, ou None se nenhum manipulador personalizado estiver definido.

default_exception_handler(context: dict) None#

O manipulador de exceções padrão que é chamado.

call_exception_handler(context: dict) None#

Chama o manipulador de exceções atual. O argumento context é repassado e é um dicionário contendo as chaves: 'message', 'exception', 'future'.