asyncio — planificador de E/S asíncrona#

Este módulo proporciona un planificador de multitarea cooperativa para corrutinas async/await, junto con primitivas de sincronización (bloqueos, eventos) y redes TCP no bloqueantes mediante lectores y escritores de flujos. Las tareas se ejecutan de forma concurrente en un único bucle de eventos; la tarea que se está ejecutando devuelve el control al bucle con await.

Ejemplo:

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

Funciones principales#

asyncio.create_task(coro: Coroutine) Task#

Crea una nueva tarea a partir de la corrutina dada y la planifica para su ejecución.

Devuelve el objeto Task correspondiente.

asyncio.current_task() Task#

Devuelve el objeto Task asociado a la tarea que se está ejecutando actualmente.

asyncio.run(coro: Coroutine) Any#

Crea una nueva tarea a partir de la corrutina dada y la ejecuta hasta que finaliza.

Devuelve el valor devuelto por coro.

asyncio.sleep(t: float) None#

Duerme durante t segundos (puede ser un valor de tipo float).

Esto es una corrutina.

asyncio.sleep_ms(t: int) None#

Duerme durante t milisegundos.

Esto es una corrutina, y una extensión de MicroPython.

Funciones adicionales#

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

Espera a que el awaitable finalice, pero lo cancela si tarda más de timeout segundos. Si awaitable no es una tarea, se creará una tarea a partir de él.

Si se produce un tiempo de espera agotado, se cancela la tarea y se lanza asyncio.TimeoutError: esto debería ser capturado por quien realiza la llamada. La tarea recibe asyncio.CancelledError, que puede ignorarse o capturarse usando try...except o try...finally para ejecutar código de limpieza.

Devuelve el valor de retorno de awaitable.

Esto es una corrutina.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any#

Similar a wait_for(), pero timeout es un entero en milisegundos.

Esto es una corrutina, y una extensión de MicroPython.

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

Ejecuta todos los awaitables de forma concurrente. Cualquier awaitable que no sea una tarea se promueve a tarea.

Devuelve una lista con los valores de retorno de todos los awaitables.

Esto es una corrutina.

class Task#

class asyncio.Task#

Este objeto envuelve una corrutina en una tarea en ejecución. Se puede esperar a las tareas usando await task, lo que esperará a que la tarea finalice y devolverá el valor de retorno de la tarea.

Las tareas no deben crearse directamente, sino que se debe usar create_task() para crearlas.

cancel() None#

Cancela la tarea inyectando asyncio.CancelledError en ella. La tarea puede ignorar esta excepción. El código de limpieza puede ejecutarse capturándola, o mediante try ... finally.

class Event#

class asyncio.Event#

Crea un nuevo evento que puede usarse para sincronizar tareas. Los eventos comienzan en el estado borrado.

is_set() bool#

Devuelve True si el evento está establecido, False en caso contrario.

set() None#

Establece el evento. Cualquier tarea que esté esperando el evento se planificará para su ejecución.

Nota: Esto debe llamarse desde dentro de una tarea. No es seguro llamarlo desde una IRQ, una función de retorno (callback) del planificador u otro hilo. Consulte ThreadSafeFlag.

clear() None#

Borra el evento.

wait() None#

Espera a que el evento se establezca. Si el evento ya está establecido, regresa inmediatamente.

Esto es una corrutina.

class ThreadSafeFlag#

class asyncio.ThreadSafeFlag#

Crea una nueva bandera que puede usarse para sincronizar una tarea con código que se ejecuta fuera del bucle de asyncio, como otros hilos, IRQs o funciones de retorno (callbacks) del planificador. Las banderas comienzan en el estado borrado.

set() None#

Establece la bandera. Si hay una tarea esperando la bandera, se planificará para su ejecución.

clear() None#

Borra la bandera. Esto puede usarse para asegurar que una bandera posiblemente establecida con anterioridad esté borrada antes de esperarla.

wait() None#

Espera a que la bandera se establezca. Si la bandera ya está establecida, regresa inmediatamente. La bandera se reinicia automáticamente al regresar de wait.

Solo una tarea a la vez puede esperar una bandera.

Esto es una corrutina.

class Lock#

class asyncio.Lock#

Crea un nuevo bloqueo que puede usarse para coordinar tareas. Los bloqueos comienzan en el estado desbloqueado.

Además de los métodos siguientes, los bloqueos pueden usarse en una sentencia async with.

locked() bool#

Devuelve True si el bloqueo está bloqueado, False en caso contrario.

acquire() bool#

Espera a que el bloqueo esté en el estado desbloqueado y luego lo bloquea de forma atómica. Solo una tarea puede adquirir el bloqueo a la vez.

Esto es una corrutina.

release() None#

Libera el bloqueo. Si hay tareas esperando el bloqueo, la siguiente en la cola se planifica para su ejecución y el bloqueo permanece bloqueado. De lo contrario, ninguna tarea está esperando y el bloqueo pasa a estar desbloqueado.

Conexiones de flujo TCP#

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

Abre una conexión TCP al host y port dados. La dirección de host se resolverá usando socket.getaddrinfo(), que actualmente es una llamada bloqueante. Si ssl es un objeto ssl.SSLContext, este contexto se usa para crear el transporte; si ssl es True, se usa un contexto predeterminado.

Devuelve un par de flujos: un flujo lector y un flujo escritor. Lanzará un OSError específico del socket si no se pudo resolver el host o si no se pudo establecer la conexión.

Esto es una corrutina.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server#

Inicia un servidor TCP en el host y port dados. La callback se llamará con las conexiones entrantes y aceptadas, y se le pasarán 2 argumentos: el flujo lector y el flujo escritor de la conexión.

Si ssl es un objeto ssl.SSLContext, este contexto se usa para crear el transporte.

Devuelve un objeto Server.

Esto es una corrutina.

class asyncio.Stream#

Esto representa una conexión de flujo TCP. Para minimizar el código, esta clase implementa tanto un lector como un escritor, y tanto StreamReader como StreamWriter son alias de esta clase.

get_extra_info(v: str) Any#

Obtiene información adicional sobre el flujo, indicada por v. Los valores válidos para v son: peername.

close() None#

Cierra el flujo.

wait_closed() None#

Espera a que el flujo se cierre.

Esto es una corrutina.

read(n: int = -1) bytes#

Lee hasta n bytes y los devuelve. Si no se proporciona n o es -1, lee todos los bytes hasta EOF. El valor devuelto será un objeto bytes vacío si se encuentra EOF antes de leer algún byte.

Esto es una corrutina.

readinto(buf: bytearray | memoryview) int#

Lee hasta n bytes en buf, siendo n igual a la longitud de buf.

Devuelve el número de bytes leídos en buf.

Esto es una corrutina, y una extensión de MicroPython.

readexactly(n: int) bytes#

Lee exactamente n bytes y los devuelve como un objeto bytes.

Lanza una excepción EOFError si el flujo termina antes de leer n bytes.

Esto es una corrutina.

readline() bytes#

Lee una línea y la devuelve.

Esto es una corrutina.

write(buf: bytes) None#

Acumula buf en el búfer de salida. Los datos solo se vacían cuando se llama a Stream.drain(). Se recomienda llamar a Stream.drain() inmediatamente después de llamar a esta función.

drain() None#

Vacía (escribe) todos los datos de salida almacenados en el búfer hacia el flujo.

Esto es una corrutina.

class asyncio.Server#

Esto representa la clase de servidor devuelta por start_server(). Puede usarse en una sentencia async with para cerrar el servidor al salir.

close() None#

Cierra el servidor.

wait_closed() None#

Espera a que el servidor se cierre.

Esto es una corrutina.

Bucle de eventos#

asyncio.get_event_loop() Loop#

Devuelve el bucle de eventos usado para planificar y ejecutar tareas. Consulte Loop.

asyncio.new_event_loop() Loop#

Reinicia el bucle de eventos y lo devuelve.

Nota: dado que MicroPython solo tiene un único bucle de eventos, esta función simplemente reinicia el estado del bucle, no crea uno nuevo.

class asyncio.Loop#

Esto representa el objeto que planifica y ejecuta tareas. No puede crearse; use get_event_loop() en su lugar.

create_task(coro: Coroutine) Task#

Crea una tarea a partir del coro dado y devuelve el nuevo objeto Task.

run_forever() None#

Ejecuta el bucle de eventos hasta que se llama a stop().

run_until_complete(awaitable: Awaitable) Any#

Ejecuta el awaitable dado hasta que finaliza. Si awaitable no es una tarea, se promoverá a una.

stop() None#

Detiene el bucle de eventos.

close() None#

Cierra el bucle de eventos.

set_exception_handler(handler: Callable) None#

Establece el manejador de excepciones que se llamará cuando una Task lance una excepción que no se captura. El handler debe aceptar dos argumentos: (loop, context).

get_exception_handler() Callable | None#

Obtiene el manejador de excepciones actual. Devuelve el manejador, o None si no se ha establecido ningún manejador personalizado.

default_exception_handler(context: dict) None#

El manejador de excepciones predeterminado que se llama.

call_exception_handler(context: dict) None#

Llama al manejador de excepciones actual. El argumento context se pasa a través y es un diccionario que contiene las claves: 'message', 'exception', 'future'.