/* Page prose (ja) */
"RunningWorkConcurrentlyWithAsyncLet" = "# `async let` で作業を並行して実行する\n\nここが async/await の真価を発揮し始める場面です。ラテには2つの遅いステップが必要だとしましょう。ミルクをスチームする *そして* ショットを抽出する、です。それぞれ約1秒かかります。まずは素直なバージョンの時間を計ってみましょう。";
"RunningWorkConcurrentlyWithAsyncLet-2" = "この2つの await は **順番に** 実行されます。それぞれの `await` は、次の行が始まる前に完全に終わります。ミルクがスチームされ（1秒）、*その後で初めて* ショットが始まります（さらに1秒）。合計で約 **2秒** です。しかし、ミルクをスチームすることとショットを抽出することは互いに依存していません。本物のバリスタなら同時にやるでしょう。\n\n`async let` を使えば、まさにそれを表現できます。非同期の作業を即座に **開始** し、いずれ得られる結果を名前に束縛します。その名前を `await` するのは、実際に値が必要になったときだけです。";
"RunningWorkConcurrentlyWithAsyncLet-3" = "2つの `async let` の行は、両方の作業を待たずに立て続けに始動させます。次の行の `await` に到達するころには、両者はずっと *並行して* スチームと抽出を続けてきたことになります。\n\n**実行して確認:** このページは `Concurrent total: 1.0x s` と表示します。上の順番に実行するバージョンと比べてみましょう。そちらは `Sequential total: 2.0x s` と表示し、2つの1秒の待機が重なり合わずに積み上がっています。\n\nこれが見出しです。**2つの1秒のタスクが、約2秒ではなく約1秒で終わります。** スレッドやキューを手作業で追加したわけではありません。どの作業が独立しているかを Swift に伝えただけで、待機を代わりに重ね合わせてくれたのです。経過時間の数値はちょうど `1.00` や `2.00` にはなりません（少しのオーバーヘッドがあります）が、ほぼ倍の差は紛れもありません。\n\n> **なぜ2つの `await` ではなく `async let` なのか。** 素の `await` はその場で *待機する* ので、2つ目の呼び出しは1つ目が戻るまで始められません。`async let` は作業を *開始* して待機を先送りします。これこそが2つの独立したタスクを同時に走らせるものです。互いの結果に依存しない作業があるときは、いつでもこれを使いましょう。\n\nこれは **構造化された並行処理** の最初の味見です。いくつかの作業を開始し、それらの結果を明確なスコープの中で集めます。`async let` は2つや3つの決まった作業をうまく扱えます。作業のまるごと *ひとまとまり*（たとえば一度に10杯のドリンク）を扱うときは、**`TaskGroup`** が欲しくなります。これは章 [Task Groups](Task%20Groups.playgroundchapter/Overview) の主題です。そして `Task` そのものの詳細は、まず章 [タスクとキャンセル](Tasks%20and%20Cancellation.playgroundchapter/Overview) で扱います。\n\n* callout(試してみよう): `pullShot()` の遅延を `.seconds(2)` に変え、`steamMilk()` は `.seconds(1)` のままにしてみましょう。並行の合計は今度はいくつになり、どのステップがそれを決めますか？\n\n[前へ](@previous)  |  7 / 8 ページ  |  [次へ: まとめ](@next)";
