GILのないPython(Free-Threaded Python)でasyncioの性能をスケールさせる
(labs.quansight.org)結論
Python 3.14のfree-threadedビルドでは、asyncioがグローバルインタプリタロック(GIL)を廃止し、スレッドごとの状態管理へ移行することで、真の並列実行を可能にしました。これにより、スレッド数に応じて性能が線形にスケールし、複数のイベントループを並列に実行できるようになり、高性能なマルチスレッドasyncioアプリケーションの新たな可能性が開かれました。
主な変更点
- GIL (Global Interpreter Lock) の廃止: CPythonのfree-threadedビルドではGILを取り除き、複数のスレッドが同時にPythonコードを実行できるようにします。
- スレッドセーフ性の確保: asyncioはグローバルなデータ構造の代わりにスレッドごとの状態管理を用いることで、スレッドセーフ性を確保しました。
- タスクの保存: グローバルな
WeakSetの代わりにスレッドごとの循環双方向連結リストを使い、ロック競合と弱参照のオーバーヘッドを取り除きました。 - 現在のタスクの保存: 「現在のタスク」をスレッド状態に保存することで、より高速でロック不要のアクセスを可能にしました。
- タスクの保存: グローバルな
性能向上
- 線形の性能スケーリング: ベンチマークの結果、free-threadedビルドではスレッド数の増加に伴ってasyncioの性能が線形に向上することが示されました。
- TCPベンチマーク: GILが有効なビルドと比べて、free-threadedビルドではスループットが大幅に向上しました。
- Webスクレイピングベンチマーク: aiohttpを使ったWebスクレイピングのベンチマークでは、free-threadedビルドで複数のワーカーを使った場合、性能が2倍以上向上しました.
まだコメントはありません。