asyncio — escalonador de I/O assíncrono#

Este módulo fornece um escalonador de multitarefa cooperativa para corrotinas async/await, juntamente com primitivos de sincronização (bloqueios, eventos) e rede TCP não bloqueante via leitores e escritores de fluxo. As tarefas são executadas de forma concorrente num único ciclo de eventos; a tarefa em execução cede o controlo ao ciclo 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 indicada e agenda a sua execução.

Devolve o objeto Task correspondente.

asyncio.current_task() Task#

Devolve o objeto Task associado à tarefa em execução no momento.

asyncio.run(coro: Coroutine) Any#

Cria uma nova tarefa a partir da corrotina indicada e executa-a até à conclusão.

Devolve o valor devolvido por coro.

asyncio.sleep(t: float) None#

Aguarda t segundos (pode ser um número de vírgula flutuante).

Esta é uma corrotina.

asyncio.sleep_ms(t: int) None#

Aguarda t milissegundos.

Esta é uma corrotina e uma extensão MicroPython.

Funções adicionais#

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any#

Aguarda a conclusão do awaitable, mas cancela-o se demorar mais de timeout segundos. Se awaitable não for uma tarefa, será criada uma tarefa a partir dele.

Se ocorrer um tempo limite, a tarefa é cancelada e é lançada a exceção asyncio.TimeoutError: esta deve ser tratada pelo chamador. A tarefa recebe asyncio.CancelledError, que pode ser ignorada ou tratada com try...except ou try...finally para executar código de limpeza.

Devolve 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 MicroPython.

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

Executa todos os awaitables de forma concorrente. Os awaitables que não sejam tarefas são promovidos a tarefas.

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

Esta é uma corrotina.

class Task#

class asyncio.Task#

Este objeto encapsula uma corrotina numa tarefa em execução. As tarefas podem ser aguardadas com await task, o que aguardará a conclusão da tarefa e devolverá o seu valor de retorno.

As tarefas não devem ser criadas diretamente; utilize create_task() para as criar.

cancel() None#

Cancela a tarefa injetando asyncio.CancelledError nela. A tarefa pode ignorar esta exceção. O código de limpeza pode ser executado capturando a exceção ou com try ... finally.

class Event#

class asyncio.Event#

Cria um novo evento que pode ser utilizado para sincronizar tarefas. Os eventos são iniciados no estado limpo.

is_set() bool#

Devolve True se o evento estiver definido, False caso contrário.

set() None#

Define o evento. Quaisquer tarefas à espera do evento serão agendadas para execução.

Nota: Este método deve ser chamado a partir de uma tarefa. Não é seguro chamá-lo a partir de uma IRQ, callback do escalonador ou outra thread. Consulte ThreadSafeFlag.

clear() None#

Limpa o evento.

wait() None#

Aguarda que o evento seja definido. Se o evento já estiver definido, retorna imediatamente.

Esta é uma corrotina.

class ThreadSafeFlag#

class asyncio.ThreadSafeFlag#

Cria uma nova bandeira que pode ser utilizada para sincronizar uma tarefa com código a executar fora do ciclo asyncio, como outras threads, IRQs ou callbacks do escalonador. As bandeiras são iniciadas no estado limpo.

set() None#

Define a bandeira. Se houver uma tarefa à espera da bandeira, esta será agendada para execução.

clear() None#

Limpa a bandeira. Pode ser utilizado para garantir que uma bandeira possivelmente definida anteriormente seja limpa antes de aguardar por ela.

wait() None#

Aguarda que a bandeira seja definida. Se a bandeira já estiver definida, retorna imediatamente. A bandeira é automaticamente reposta após o retorno de wait.

Uma bandeira só pode ser aguardada por uma única tarefa de cada vez.

Esta é uma corrotina.

class Lock#

class asyncio.Lock#

Cria um novo bloqueio que pode ser utilizado para coordenar tarefas. Os bloqueios são iniciados no estado desbloqueado.

Para além dos métodos abaixo, os bloqueios podem ser utilizados numa instrução async with.

locked() bool#

Devolve True se o bloqueio estiver bloqueado, False caso contrário.

acquire() bool#

Aguarda que o bloqueio esteja no estado desbloqueado e, em seguida, bloqueia-o de forma atómica. Apenas uma tarefa pode adquirir o bloqueio de cada vez.

Esta é uma corrotina.

release() None#

Liberta o bloqueio. Se houver tarefas à espera do bloqueio, a próxima na fila é agendada para execução e o bloqueio permanece bloqueado. Caso contrário, não há tarefas à espera e o bloqueio passa ao estado desbloqueado.

Ligações TCP de fluxo#

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]#

Abre uma ligação TCP ao host e port indicados. O endereço de host será resolvido com socket.getaddrinfo(), que é atualmente uma chamada bloqueante. Se ssl for um objeto ssl.SSLContext, este contexto é utilizado para criar o transporte; se ssl for True, é utilizado um contexto predefinido.

Devolve um par de fluxos: um leitor e um escritor. Lançará um OSError específico de socket se o host não puder ser resolvido ou se a ligaçã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 port indicados. O callback será chamado com as ligações recebidas e aceites, recebendo 2 argumentos: fluxos de leitura e escrita para a ligação.

Se ssl for um objeto ssl.SSLContext, este contexto é utilizado para criar o transporte.

Devolve um objeto Server.

Esta é uma corrotina.

class asyncio.Stream#

Representa uma ligação TCP de fluxo. Para minimizar o código, esta classe implementa tanto um leitor como um escritor, e tanto StreamReader como StreamWriter são alias desta classe.

get_extra_info(v: str) Any#

Obtém informações adicionais sobre o fluxo, indicadas por v. Os valores válidos para v são: peername.

close() None#

Fecha o fluxo.

wait_closed() None#

Aguarda que o fluxo seja fechado.

Esta é uma corrotina.

read(n: int = -1) bytes#

Lê até n bytes e devolve-os. Se n não for fornecido ou for -1, lê todos os bytes até ao EOF. O valor devolvido será um objeto bytes vazio se o EOF for encontrado antes de qualquer byte ser lido.

Esta é uma corrotina.

readinto(buf: bytearray | memoryview) int#

Lê até n bytes para buf, sendo n igual ao comprimento de buf.

Devolve o número de bytes lidos para buf.

Esta é uma corrotina e uma extensão MicroPython.

readexactly(n: int) bytes#

Lê exatamente n bytes e devolve-os como objeto bytes.

Lança uma exceção EOFError se o fluxo terminar antes de ler n bytes.

Esta é uma corrotina.

readline() bytes#

Lê uma linha e devolve-a.

Esta é uma corrotina.

write(buf: bytes) None#

Acumula buf no buffer de saída. Os dados só são enviados quando Stream.drain() é chamado. Recomenda-se chamar Stream.drain() imediatamente após chamar esta função.

drain() None#

Esvazia (escreve) todos os dados de saída em buffer para o fluxo.

Esta é uma corrotina.

class asyncio.Server#

Representa a classe de servidor devolvida por start_server(). Pode ser utilizada numa instrução async with para fechar o servidor ao sair.

close() None#

Fecha o servidor.

wait_closed() None#

Aguarda que o servidor seja fechado.

Esta é uma corrotina.

Ciclo de Eventos#

asyncio.get_event_loop() Loop#

Devolve o ciclo de eventos utilizado para agendar e executar tarefas. Consulte Loop.

asyncio.new_event_loop() Loop#

Reinicia o ciclo de eventos e devolve-o.

Nota: como o MicroPython tem apenas um único ciclo de eventos, esta função limita-se a repor o estado do ciclo, não cria um novo.

class asyncio.Loop#

Representa o objeto que agenda e executa tarefas. Não pode ser criado diretamente; utilize get_event_loop() em vez disso.

create_task(coro: Coroutine) Task#

Cria uma tarefa a partir de coro e devolve o novo objeto Task.

run_forever() None#

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

run_until_complete(awaitable: Awaitable) Any#

Executa o awaitable indicado até à sua conclusão. Se awaitable não for uma tarefa, será promovido a uma.

stop() None#

Para o ciclo de eventos.

close() None#

Fecha o ciclo de eventos.

set_exception_handler(handler: Callable) None#

Define o tratador de exceções a chamar quando uma Task lança uma exceção não capturada. O handler deve aceitar dois argumentos: (loop, context).

get_exception_handler() Callable | None#

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

default_exception_handler(context: dict) None#

O tratador de exceções predefinido que é chamado.

call_exception_handler(context: dict) None#

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