/* Page prose (es) */
"Overview" = "# Grupos de tareas\n\nDigamos que estás construyendo una herramienta de astronomía que apila fotos. Para convertir una mancha tenue en una galaxia nítida, capturas el mismo trozo de cielo muchas veces y **apilas** los fotogramas: combinas docenas o cientos de exposiciones en una sola imagen limpia. Cada fotograma tiene que cargarse y calibrarse antes de unirse a la pila, y esos trabajos no dependen entre sí, así que te encantaría ejecutarlos todos a la vez. Pero no sabes la cantidad de antemano: esta noche son 8 fotogramas, mañana son 200. En el capítulo [Fundamentos de async/await](Async%20Await%20Basics.playgroundchapter/Overview) conociste `async let` para ejecutar en paralelo un puñado *fijo y conocido* de trabajos. Este capítulo es la herramienta para una cantidad *dinámica*: el **grupo de tareas**.\n\n---\n\n## Qué aprenderás\n\n* Por qué `async let` se queda corto cuando el número de trabajos paralelos no es fijo.\n* Cómo repartir `N` tareas hijas concurrentes con `withTaskGroup` y recolectar sus resultados.\n* Por qué los resultados llegan en **orden de finalización**, y cómo volver a ponerlos en orden.\n* Cómo `withThrowingTaskGroup` maneja un error: cancela el resto y relanza.\n* La **garantía estructurada** (el grupo nunca fuga una tarea) y cómo la cancelación fluye hacia las hijas.\n* Un patrón para **limitar** cuántas tareas hijas se ejecutan a la vez, y por qué querrías hacerlo.\n\nCuando quieras, pasa la página y veremos exactamente dónde se queda corto `async let`.\n\npágina 1 de 9  |  [Siguiente: Dónde se queda corto async let](@next)";
