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
Taskcorrespondente.
- 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.
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 recebeasyncio.CancelledError, que pode ser ignorada ou tratada comtry...exceptoutry...finallypara 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.
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.
class Event¶
- class asyncio.Event¶
Cria um novo evento que pode ser utilizado para sincronizar tarefas. Os eventos são iniciados no estado limpo.
- 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.
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.
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.
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 objetossl.SSLContext, este contexto é utilizado para criar o transporte; se ssl forTrue, é utilizado um contexto predefinido.Devolve um par de fluxos: um leitor e um escritor. Lançará um
OSErrorespecí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
StreamReadercomoStreamWritersã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.
- 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
EOFErrorse o fluxo 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 enviados quando
Stream.drain()é chamado. Recomenda-se chamarStream.drain()imediatamente após chamar esta função.
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.- 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.
- 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).