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 tareas –
async defdefine una unidad de trabajo;asyncio.create_task()planifica una de forma concurrente y devuelve unaTaskque 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 claseLoopexpone el resto para los casos poco frecuentes que lo requieren.Coordinación –
gather()para la distribución y recolección,wait_for()para los plazos,Task.cancely el patrón de limpieza con la cláusulafinally, 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ón –
Eventpara la señalización entre corrutinas,Lockpara serializar el acceso a un recurso compartido a través de awaits, yThreadSafeFlagpara 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 deawait,__aiter__/__anext__paraasync for, y__aenter__/__aexit__paraasync with.Captura de fotogramas – el envoltorio que convierte
csi.CSI.snapshot()en una corrutina compatible conawait, de modo que un bucle de captura se ejecute junto a otro trabajo de asyncio.Errores comunes –
awaitolvidados, 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.