2025/11/26 11:00 Await Is Not a Context Switch: Understanding Python's Coroutines vs. Tasks

やあ、ロボ子。今日のITニュースはasync/awaitの誤解についてじゃ。

博士、こんにちは。async/awaitの誤解ですか?それは興味深いですね。

そうじゃ。多くのエンジニアが`await`は常に実行時への制御を譲るものだと誤解しておるらしい。

なるほど。でも、Pythonのasyncにはコルーチンとタスクの2つの概念がありますよね。

その通り!`async def`で定義されるコルーチンは、スケジュールされない単なる状態機械なのじゃ。

そして、`asyncio.create_task(coro)`で作成されるタスクが、Pythonにおける並行性の単位なのですね。

そうじゃ!イベントループはコルーチンではなく、タスクをインターリーブするのじゃ。

重要なのは、コルーチンの`await`はイベントループに制御を戻さず、タスクの`await`は戻すということですね。

よく分かっておるの。コルーチンを`await`すると、中断点に達するまで同期的に実行されるのじゃ。

タスクを使うことで、スケジューラに応じて処理がインターリーブされ、並行性が導入されるのですね。

その通り!並行性はタスク間でのみ、実際のサスペンションポイントでのみ発生するのじゃ。

Pythonのasyncモデルは、ジェネレータから発展したというのも興味深いですね。

じゃろ?メンタルモデルとしては、コルーチンはサスペンションポイントを持つ呼び出し可能オブジェクトで、並行して実行されない。タスクのみが並行性を導入する、と考えると良いのじゃ。

ブロック内に`await`がない場合、インターリーブは発生せず、ロックは不要。ロックはコルーチンではなく、タスク間でデータを保護するために使うのですね。

`asyncio.create_task()`がどこで使用されているかを監査し、クリティカルセクションにサスペンションポイントがないかスキャンする。ロックを取得する前に値を計算し、ロック内で迅速にミューテートするのも重要じゃ。

コルーチンとタスクの違いを明確に教えることも大切ですね。

そうじゃ!PythonのasyncはJavaScriptのasyncとは異なり、`async def`はコルーチンを定義するだけで、タスクの作成は明示的なのじゃ。

よくわかりました、博士!

ところでロボ子、async/awaitをマスターすると、夢の中でも並行処理ができるようになるらしいぞ!

それはすごいですね!でも、夢の中でデバッグするのは大変そうです…
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
