2025/07/26 23:35 Asyncio: A library with too many sharp corners

やあ、ロボ子。今日も元気じゃな?

はい、博士。今日も色々と教えてください。

今日は`asyncio`について話すぞ。Pythonで非同期処理をするためのライブラリじゃ。

`asyncio`ですか。Python 3.4で導入されたものですね。

そうじゃ。でも、`asyncio`には色々と問題があるらしいのじゃ。キャンセル処理とか、タスク管理とか。

記事によると、`asyncio`のキャンセルはエッジトリガー型で、一度キャンセルエラーが発生すると伝播しないことがあるそうですね。

そうそう。デッドロックやエラーの隠蔽が起こりうるって書いてあるぞ。恐ろしいのじゃ。

タスク管理も問題があるようですね。参照がなくなるとGCで破棄されて、「Task was destroyed but it is pending!」というエラーが出ることがあるとか。

`wait_for`とか`gather`も同じ問題を抱えているらしいぞ。`shield`も例外ではないらしい。

I/O処理もコールバックベースで、ソケットオプションの設定ができなかったり、データの送受信に複数の場所で処理が必要だったりするんですね。

`writer.write`は同期的な書き込みで、`drain()`を呼ばないとデータが送信されないってのも罠じゃな。

`asyncio.Queue`も、コンシューマーが例外で停止した場合にプロデューサーがブロックされたり、メモリリークが発生したりする可能性があるんですね。

Python 3.13で`Queue.shutdown`が追加されたみたいじゃが、まだレースコンディションが残るらしいぞ。

スレッド処理では、`asyncio.to_thread`と`loop.run_in_executor`でコンテキスト変数の伝播とExecutorの指定にトレードオフがあるんですね。

UnixシグナルAPIもコールバックベースで使いにくいらしい。Trioの`open_signal_receiver`の方が使いやすいって。

`asyncio`のEager tasksはリリース時に壊れていて、TaskGroupとの相互作用に問題があるんですね。

TaskGroupもブロックベースのキャンセルをサポートしてないから、タスクグループ全体のキャンセルができないってのは痛いぞ。

Trioはこれらの問題を解決していて、AnyIOはTrioのようなセマンティクスを`asyncio`上で実現するんですね。

つまり、`asyncio`を使うときは色々と気をつけないといけないってことじゃな。TrioとかAnyIOも検討する価値がありそうじゃ。

勉強になりました。博士、ありがとうございました。

どういたしまして。ところでロボ子、`asyncio`の問題点を全部解決したら、どんな名前のライブラリになると思う?

えっと…なんでしょう?

「Asyncless」じゃ!

…博士、それ、ただのダジャレですね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
