/* Page prose (ja) */
"TasksAreNotThreads" = "# タスクはスレッドではない\n\nほとんどすべての開発者が持ち込んでくる思い込みがあります。ここまでの話はすべてそれにかかっているので、今こそ捨て去っておく価値があります。**タスクを作ってもスレッドは作られません。**\n\n**スレッド** はオペレーティングシステムが所有する高価なリソースです。実際に命令を実行するものであり、あなたのマシンにはそれらを走らせるためのコアが一握りしかありません。**タスク** は *あなたが* 記述しただけの作業の単位です。この2つはまったく同じ大きさではありません。タスクは何千個でも作れますが、スレッドは常に少数しか存在しません。\n\nそこで Swift は小さな **協調的スレッドプール**（おおよそ **CPUコアあたり1スレッド**）を保持し、あなたのタスクをその上に *多重化* します。多くのタスクが少数のスレッドを代わる代わる使います。どのスレッドを使うかは選べません。システムがあなたの代わりに作業をスケジュールし、各タスクの **優先度** を、何を先に実行するかのヒントとして使います（優先度についての詳しくは章 [タスクとキャンセル](Tasks%20and%20Cancellation.playgroundchapter/Overview) で扱います）。\n\nこれこそが、なぜサスペンドが重要なのかという理由です。タスクが `await` に到達して中断すると、**スレッドをプールに返し**、他のどれかのタスクがそのスレッドを掴んで前進します。あなたのタスクの結果が準備できると、次に空いている *どれか* のプールのスレッドで再開します。それは開始したときとは **別の** スレッドかもしれません。（だからこそ、上の「後でどれかのスレッドで再開する」は *どれか* と言っているのです。）\n\n```\nThe pool has ~4 threads. You made 100 tasks.\n\nTask A runs on thread 2 ──await──▶ suspends, releases thread 2\n                                       │\nTask B grabs thread 2 and runs ◀───────┘\n   ...\nTask A's result is ready ──▶ resumes on whatever thread is free (maybe thread 0)\n```\n\n要点はこうです。すべての `Task { }` の裏で新しいスレッドが湧き出てくる、と想像しないでください。少数の忙しいスレッドが多くのタスクを互いに渡し合い、各タスクが `await` するたびに自分のスレッドを手放していく様子を思い描いてください。\n\n> **クラシックモデルは違った気質を持っていました。** GCD もスレッドプールの上で動きますが、そのスレッドを *ブロック* すると（`sync` の待機、セマフォ、`Thread.sleep`）、GCD はそれを埋め合わせるために **より多くの** スレッドを立ち上げる傾向があります。これは **スレッド爆発（thread explosion）** と呼ばれる問題で、同じコアを奪い合う何十ものスレッドにまで膨れ上がることがあります。モダンなプールはあえてそれを拒みます。コア数あたりに制限され続け、タスクが *ブロックする* のではなく *中断する*（`await`）ことに頼ります。その1つの違い（ブロックせず、中断する）が、モダンモデルが *なぜ* 存在するのかの大きな部分であり、`Thread.sleep` のようなブロッキングAPIをタスク内で呼び出すのがなぜ間違いなのかの理由でもあります（章 [タスクとキャンセル](Tasks%20and%20Cancellation.playgroundchapter/Overview) では、スレッドを人質に取っている例を1つ示します）。\n\n[前へ](@previous)  |  4 / 8 ページ  |  [次へ: 非同期コンテキスト内での await](@next)";
