import asyncio: Learn Python's AsyncIOの視聴メモ
はじめに
import asyncio: Learn Python'sはasyncioの初心者向けを自称する動画です。2020年公開の動画ですが、2025年時点でもasyncioを学ぶ最適な資料の一つだと考えられます。
この動画の作者はPython Coreチームメンバーの一人で、
A Conceptual Overview of asyncioというPythonの公式のドキュメントから参考資料としてリンクが貼られています。
ちなみに初心者向けの動画を自称してますが、あくまでasyncioについて初心者向けの動画であって、asyncioライブラリのコードの中身を見てみるくらいの気合が必要なストロングスタイルな初心者向けです。
各章のメモ
1.The Async Ecosystem
非同期エコシステムの「全体像」をつかむ回。
スレッドの話あたりまではスレッドの知見があれば、よくある話なのでスキップ可能。
AsyncIOに至るまでの歴史は面白い。
- Latency
- レイテンシがユーザー体験にどう悪影響を与えるか
- concurrency と parallelismの違い
- Pythonでのスレッドの問題などの話
- AsyncIOに至るまでの歴史
- Medusa/Asyncore
- Twisted
- Stackless Python
- gevent
- Tornado
- 関係するPEPの流れ
2.The Event Loop
イベントループの話。ふつうにLib/asyncio/base_events.pyの解説をしだすので、このあたりから初心者向けの定義に疑義を持つ。
- event loopとはなにか
- 高レベルの観点でのAsyncIO event loopの使い方
- ReactorとProactor
- Reactor(UNIXのselect) : 準備完了通知を受け取り、アプリ側が非ブロッキングで read()/write() を実行するモデル。
- Proactor(WindowsのIOCP):先に「このバッファに読み込んで/書いて」と非同期I/OをOSに発行し、I/O完了通知を受け取るモデル(実I/OはOSが実行)。
- AsyncIOがイベントループをどう実装してるかを確認
- CPythonのコードを読み出す(初心者向けとは...)
- uvloopの紹介
- イベントループを置き換えて早くするライブラリ
3. Using Coroutines
ここまで1時間以上みて初めてasync/awaitが出てくる。
サンプルコードではいくつか注意が必要
- async関数とコルーチンについて
- awaitの話
- wait_for()
- gatherによる複数タスクの同時実行の話
- TimeoutErrorとCancelledErrorの例外処理
- FutureとTaskの説明
- 簡易のWebクローラーのサンプル
~~httpxの非同期の実行方法についてはmax_connectionsなどで制限されているので、無制限に同時アクセスしているわけではないので、サーバーにはそんなに負荷を与えていない想定。~~可能ならセマフォなどで制限した方が良さそう
4 - Coroutines Under The Hood
Coroutinesの深掘りをする話。
この辺から映像を、とめてコードを再現して動かすのが厳しくなるサンプルがちらほらでてくる。
現在のライブラリの中身だけでなく過去のライブラリの中身を読む必要がでてくる。
- Futureの話
- 使い方
- Futuresがどんな実装されているか
- Python3.4の時どうしてたかの話
- 3.4.1で確認すれば映像と一致しそう
- ジェネレーターの話
- Taskの深掘り
- Python3.8だとどうなっているか
- AsyncIOのデバッグの方法
5 - Batteries Included
asyncioの実用的な内容。
db接続とかしてくるので、簡単に試すのにはちょっとハードルが高くなってくる。
clients と serversのチャットプログラムは、映像を止めれば再現できる。
- async with
- async for
- async generator
- clients と serversのチャットプログラムの例
- キューを用いたタスク協調
- Lock, Event, Semaphore, Condition
6- An Example Web Application with Starlette and EdgeDB
Starletteという非同期のWebサービスを構築する。
使う予定のないWebサービスのフレームワークの話なので一旦保留。
まとめ
なんとなくasyncioを使っている状態で見ると自分の愚かさがわかって一からやり直す気になれます。
実際どう動いているかをライブラリのコードを交えて説明してくれているので、時間はかかるが、もっともわかりやすいコンテンツであるとは思います。
Discussion