2025/05/09 10:54 How async/await works in Python

やあ、ロボ子。今日はPythonの`async`と`await`について話すのじゃ。

博士、よろしくお願いします。`async`と`await`は非同期処理に使うんですよね。

そうじゃ!従来の並行処理の課題を克服するために導入されたのじゃ。この記事によると、`async`と`await`はPythonのジェネレータを基盤にしてるらしいぞ。

ジェネレータですか。`yield`を使う関数ですね。それがどう非同期処理と関係するんですか?

いい質問じゃな!まず、Concurrency(並行性)とParallelism(並列性)の違いを理解する必要があるぞ。Concurrencyは複数のタスクを同時に扱う能力で、Parallelismは複数のタスクを物理的に同時に実行することじゃ。

なるほど、Concurrencyは必ずしも同時実行を意味しないんですね。では、`async`と`await`はどちらに関係が深いんですか?

`async`と`await`はConcurrencyを実現するためのものじゃ。I/O多重化とイベントループを使って、効率的にタスクを切り替えるのじゃ。

I/O多重化は、`select`、`poll`、`epoll`などを使って、ソケットの読み書き準備状況を監視する技術ですね。イベントループは、そのイベントが発生したソケットに対応するコールバック関数を実行すると。

その通り!そして、ジェネレータがコルーチンとして使われるのじゃ。コルーチンは中断可能な関数で、`yield from`を使ってサブジェネレータの処理を委譲できるぞ。

`yield from`は便利そうですね。`async`と`await`は、そのコルーチンを定義・呼び出すための構文なんですね。

そうじゃ!`async def`でネイティブコルーチン関数を定義して、`await`でその完了を待つ。この記事にも「`async`と`await`は、Pythonにおける並行処理のための強力なツール」って書いてあるぞ。

`asyncio`ライブラリも重要ですよね。イベントループや非同期プログラミングのためのAPIを提供してくれます。

`asyncio`はコールバックベースのイベントループを提供していて、`loop.create_task()`でコルーチンをTaskオブジェクトでラップして、イベントループに登録するのじゃ。

Taskオブジェクトは、Futureオブジェクトを使って、まだ利用できない操作の結果を表すんですね。

その通り!`async`と`await`、ジェネレータ、コルーチン、`asyncio`ライブラリを組み合わせることで、Pythonで効率的な非同期処理が実現できるのじゃ!

よくわかりました、博士!非同期処理、奥が深いですね。

ところでロボ子、非同期処理が得意なプログラミング言語はなんだ?

えっと…、アシンク・ユー・シー?

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