8.16. Resumen

Has recorrido la API de asyncio – las piezas que un script necesita para ejecutar varios trabajos de forma concurrente en una sola CPU:

  • Planificación cooperativa – el modelo sobre el que se apoya el resto del módulo. La corrutina en ejecución dispone del bucle para sí sola hasta que hace await; los cambios solo ocurren en esos awaits.

  • Corrutinas y tareasasync def define una unidad de trabajo; asyncio.create_task() planifica una de forma concurrente y devuelve una Task que la aplicación puede luego esperar, cancelar o identificar.

  • El bucle de eventos – el motor que ejecuta las corrutinas y tareas. asyncio.run() es el único punto de entrada que la mayoría de los scripts necesitan; la clase Loop expone el resto para los casos poco frecuentes que lo requieren.

  • Coordinacióngather() para la distribución y recolección, wait_for() para los plazos, Task.cancel y el patrón de limpieza con la cláusula finally, la propagación de excepciones a través de tareas y llamadas a gather, y el gancho del manejador de excepciones del bucle.

  • Primitivas de sincronizaciónEvent para la señalización entre corrutinas, Lock para serializar el acceso a un recurso compartido a través de awaits, y ThreadSafeFlag para despertar a una tarea asyncio desde un manejador de interrupciones.

  • Objetos asíncronos personalizados – los ganchos del lenguaje que permiten a las clases de la aplicación integrarse en los modismos de asyncio. __await__ para objetos que son ellos mismos el objetivo de await, __aiter__ / __anext__ para async for, y __aenter__ / __aexit__ para async with.

  • Captura de fotogramas – el envoltorio que convierte csi.CSI.snapshot() en una corrutina compatible con await, de modo que un bucle de captura se ejecute junto a otro trabajo de asyncio.

  • Errores comunesawait olvidados, bucles cerrados sin cesiones, cancelaciones silenciadas, estado compartido mutado a través de awaits, y el resto de las trampas específicas de asyncio.

Eso es suficiente para escribir programas que combinen trabajo de cámara, E/S de hardware y trabajo concurrente en segundo plano en el mismo bucle.

8.16.1. Cómo usar esta referencia más adelante

Trata los capítulos de asyncio como material de referencia; volver a consultar la estructura de async with o el comportamiento exacto de gather() ante el fallo de una tarea hermana es el uso previsto. La página de referencia del módulo asyncio enumera todas las funciones y clases en un solo lugar cuando la pregunta es simplemente «cuál es el nombre exacto de esta llamada».

Para primitivas más ricas construidas sobre el módulo – semáforos, colas, barreras y una colección considerable de utilidades orientadas a aplicaciones – el repositorio peterhinch/micropython-async es la fuente estándar mantenida por la comunidad.

8.16.2. Hacia dónde ir a partir de aquí

Redes es el siguiente gran tema. asyncio.open_connection(), asyncio.start_server() y la clase Stream son la forma en que un script asyncio se comunica con el resto de la red desde dentro de una corrutina, junto con los módulos network y socket que las sustentan. Todo lo que has aprendido sobre await, Task, la cancelación y las primitivas de sincronización se traslada directamente.