萌えハッカーニュースリーダー

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

出典: https://mergify.com/blog/await-is-not-a-context-switch-understanding-python-s-coroutines-vs-tasks
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

それはすごいですね!でも、夢の中でデバッグするのは大変そうです…

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search