/* Page prose (es) */
"RunningWorkConcurrentlyWithAsyncLet" = "# Ejecutar trabajo concurrentemente con `async let`\n\nAquí es donde async/await empieza a dar frutos. Supón que un latte necesita dos pasos lentos: espumar la leche *y* extraer el shot. Cada uno tarda alrededor de un segundo. Cronometremos primero la versión obvia:";
"RunningWorkConcurrentlyWithAsyncLet-2" = "Estos dos await se ejecutan **secuencialmente**: cada `await` termina por completo antes de que empiece la línea siguiente. La leche se espuma (1 s), y solo *entonces* empieza el shot (otro 1 s). Total: alrededor de **2 segundos**. Pero espumar la leche y extraer el shot no dependen uno del otro; un barista real los haría al mismo tiempo.\n\n`async let` te deja decir exactamente eso. **Inicia** el trabajo asíncrono de inmediato y vincula el resultado eventual a un nombre; haces `await` sobre ese nombre solo cuando de verdad necesitas el valor:";
"RunningWorkConcurrentlyWithAsyncLet-3" = "Las dos líneas `async let` lanzan ambas piezas de trabajo una tras otra, sin esperar. Para cuando llegas al `await` de la línea siguiente, han estado espumando y extrayendo *en paralelo* todo el tiempo.\n\n**Míralo en acción:** esta página imprime `Concurrent total: 1.0x s`. Compáralo con la versión secuencial de arriba, que imprime `Sequential total: 2.0x s`, las dos esperas de un segundo apiladas en lugar de solaparse.\n\nEse es el titular: **dos tareas de 1 segundo terminan en ~1 s, no en ~2 s.** No añadiste hilos ni colas a mano; solo le dijiste a Swift qué trabajo era independiente, y él solapó la espera por ti. Los números transcurridos no serán exactamente `1.00` o `2.00` (hay algo de sobrecarga), pero la casi duplicación es inconfundible.\n\n> **¿Por qué `async let` y no dos `await`?** Un `await` a secas *espera* justo donde está, así que la segunda llamada no puede empezar hasta que la primera retorna. `async let` *inicia* el trabajo y aplaza la espera, que es lo que deja correr dos tareas independientes a la vez. Recurre a él siempre que tengas trabajo que no depende de los resultados del otro.\n\nEste es tu primer contacto con la **concurrencia estructurada**: iniciar varias piezas de trabajo y reunir sus resultados dentro de un ámbito claro. `async let` maneja bien dos o tres piezas fijas. Cuando tienes toda una *colección* de trabajo (digamos, diez bebidas a la vez), querrás un **`TaskGroup`**, que es el foco del capítulo [Grupos de tareas](Task%20Groups.playgroundchapter/Overview). Y los detalles de `Task` en sí vienen primero, en el capítulo [Tareas y cancelación](Tasks%20and%20Cancellation.playgroundchapter/Overview).\n\n* callout(Pruébalo): Cambia el retardo de `pullShot()` a `.seconds(2)` y deja `steamMilk()` en `.seconds(1)`, ¿cuál es el total concurrente ahora, y qué paso lo decide?\n\n[Anterior](@previous)  |  página 7 de 8  |  [Siguiente: Resumen](@next)";
