/* Page prose (es) */
"Overview" = "# Grupos y semáforos\n\nDe vuelta en la cafetería de la esquina, un cliente pide un lote para toda la oficina: un latte, un cold brew y un espresso. Lanzas los tres a la vez para que se preparen en paralelo. Bien. Pero ahora tienes un problema nuevo. Solo puedes entregarle la bandeja al cliente cuando **los tres** estén listos, y cada uno termina a su propio ritmo. ¿Cómo *sabe* tu código que el lote está completo? ¿Y qué pasa cuando cinco baristas quieren la única máquina de espresso en el mismo momento? Este capítulo trata de coordinar un grupo de tareas independientes: esperar a todas ellas, y limitar cuántas se ejecutan a la vez.\n\n---\n\n## Qué aprenderás\n\n* Cómo esperar a todo un lote de tareas asíncronas con un **`DispatchGroup`**.\n* El equilibrio `enter()`/`leave()`, `notify(queue:)` y `wait()`, y por qué `wait()` bloquea.\n* El clásico error de `enter`/`leave` desbalanceado, y cómo cuelga o falla.\n* Cómo un **`DispatchSemaphore`** limita cuántas tareas tocan un recurso a la vez.\n* Cuándo recurrir a un grupo frente a un semáforo.\n\nEste capítulo se apoya en el capítulo [Fundamentos de GCD](GCD%20Fundamentals.playgroundchapter/Overview): ya sabes cómo empujar trabajo a una cola con `async`, y la diferencia entre colas seriales y concurrentes. Ahora coordinarás ese trabajo.\n\nCuando quieras, pasa la página y lanzaremos un lote de bebidas de la forma ingenua, y veremos cómo sale mal.\n\npágina 1 de 8  |  [Siguiente: El problema: saber cuándo todo ha terminado](@next)";
