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
Taskcorrespondiente.
- asyncio.current_task() Task¶
Devuelve el objeto
Taskasociado 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.
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 recibeasyncio.CancelledError, que puede ignorarse o capturarse usandotry...exceptotry...finallypara 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.
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.
class Event¶
- class asyncio.Event¶
Crea un nuevo evento que puede usarse para sincronizar tareas. Los eventos comienzan en el estado borrado.
- 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.
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.
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.
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 objetossl.SSLContext, este contexto se usa para crear el transporte; si ssl esTrue, se usa un contexto predeterminado.Devuelve un par de flujos: un flujo lector y un flujo escritor. Lanzará un
OSErrorespecí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
StreamReadercomoStreamWriterson 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.
- 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
EOFErrorsi el flujo termina antes de leer n bytes.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 aStream.drain()inmediatamente después de llamar a esta función.
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_until_complete(awaitable: Awaitable) Any¶
Ejecuta el awaitable dado hasta que finaliza. Si awaitable no es una tarea, se promoverá a una.
- 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
Nonesi no se ha establecido ningún manejador personalizado.