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

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

出典: https://sailor.li/asyncio
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

えっと…なんでしょう?

hakase
博士

「Asyncless」じゃ!

roboko
ロボ子

…博士、それ、ただのダジャレですね。

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

Search