Resumen de [[https://github.com/peterhinch/micropython-async/blob/master/v3/docs/TUTORIAL.md]]
1. Gestión de múltiples tareas de E/S
- Escenario: Leer datos de un sensor mientras se actualiza una pantalla LED o se responde a pulsaciones de botones.
- ¿Por qué
async
?: Los microcontroladores suelen necesitar ejecutar tareas como esperar datos de sensores, escribir en pantallas o gestionar interacciones.async
permite que estas tareas se ejecuten de forma cooperativa (cediendo el control cuando están inactivas) en lugar de bloquearse entre sí. -
Ejemplo:
async def leer_sensor(): while True: datos = sensor.read() # ... procesar datos ... await asyncio.sleep(0.1) # Ceder control a otras tareas async def actualizar_pantalla(): while True: pantalla.mostrar(estado) await asyncio.sleep(1)
2. Retrasos no bloqueantes
- Escenario: Realizar acciones con intervalos distintos (ej.: parpadear un LED cada 500 ms mientras se registran datos cada 2 segundos).
- ¿Por qué
async
?:time.sleep()
bloquea todo el programa.async
lo reemplaza conawait asyncio.sleep()
, liberando el microcontrolador para otras tareas durante las esperas.
3. Gestión de protocolos de comunicación
- Escenario: Comunicación por UART, I2C o Wi-Fi mientras se ejecuta otro código.
- ¿Por qué
async
?: Las comunicaciones suelen requerir que se espere por las respuestas.async
permite iniciar una solicitud, luego cambiar a otras tareas y finalmente reanudar la tarea previa al recibir datos. - Ejemplo:
async def obtener_clima(): while True: respuesta = await wifi.get('http://api.weather.com') # ... procesar respuesta ...
4. Tareas en segundo plano con recursos compartidos
- Escenario: Registrar datos en una tarjeta SD mientras se controla un motor.
- ¿Por qué
async
?: Usar “primitivas de sincronización”, por ejemploLock
(demicropython-async
) para compartir recursos de forma segura entre tareas. -
Ejemplo:
lock = asyncio.Lock() async def registrar_datos(): async with lock: with open('log.txt', 'a') as f: f.write(datos) async def controlar_motor(): async with lock: motor.ejecutar(velocidad)
Notas clave para async
en MicroPython
- Multitarea cooperativa: Las tareas deben usar
await
explícitamente para ceder el control (no hay multitarea preemptiva, es decir, no hay control central de tareas). - Ligero: Usa mucha menos memoria que los hilos, lo cual es crítico para microcontroladores.
- Bucle de eventos: La librería
asyncio
gestiona la planificación de tareas (similar al bucle de eventos de JavaScript).
Para más detalles, consulta el tutorial de micropython-async.