概要
- Python 2から3への移行 は当初コミュニティを分裂させたが、最終的には大きな問題とならず
- Python 3.5でasync/awaitが導入 され、主にWeb開発で活用
- Python 3.14でFree-Threading(PEP 779)とMultiple Interpreters(PEP 734)が公式サポート
- asyncはI/Oバウンド処理で特に有効 だが、CPUバウンドやファイルI/Oには制限
- GILの存在や実装の違い により、asyncや並列処理の普及が限定的
Python 3.14と並行・並列処理の進化
- Python 3.14 では PEP 779: Free-Threading と PEP 734: Multiple Interpreters が公式サポート
- Free-Threading: GILを排除 し、より細かいロックで並列実行を可能に
- Multiple Interpreters: 標準ライブラリで複数インタプリタを管理 できる機能
- これらの新機能は Pythonでの並行・並列処理の大きな前進
- async/awaitは10年以上前から存在 し、主にWeb開発で利用
- しかし、 主要Webフレームワークでのasync対応は限定的
- FastAPI: 完全なasync対応
- Django:一部async対応、ORMは未対応
- Flask: 同期処理が基本
- SQLAlchemy: 2023年にasyncio対応
asyncが普及しない理由
- asyncはI/Oバウンド処理(特にネットワーク)で真価を発揮
- 複数のHTTPリクエストなど、 同時発行・待機が容易
- ファイルI/Oやサブプロセス等はasyncioで非同期化困難
- aiofilesなどのサードパーティ利用時も 内部的にはスレッドプールに依存
- OSのファイルI/O非同期API(io_uring等)は セキュリティ問題や制限あり
- 実際にはネットワークI/O以外でのasync活用は限定的
- 主要なasyncio API一覧
- Sleep: asyncio.sleep()
- TCP/UDP Streams: asyncio.open_connection()
- HTTP: aiohttp.ClientSession()
- サブプロセス: asyncio.subprocess
- キュー: asyncio.Queue
GILとasyncの限界
- GIL(Global Interpreter Lock) があるため、 CPUバウンドな処理は並列化不可
- C#のasync/awaitモデル とPythonの違い
- C#: タスクプールで自動的にスレッド管理
- Python: イベントループが単一スレッドで管理
- async関数内でblocking処理があると、イベントループ全体がブロック
- 例:time.sleep()を使うと 全体が止まる
- I/O処理やスリープ以外はほぼブロックするため、asyncの恩恵が限定的
- run_in_executor でスレッドプールと組み合わせることも可能だが、 設計が複雑化
Free-Threadingの意義と今後
- Python 3.13で実験的にFree-Threading(GILなしビルド)が登場
- 3.14でより安定化、2026年以降に本格導入を想定
- コルーチンとスレッドの比較
- コルーチン: メモリフットプリントが小さい、低いコンテキストスイッチコスト
- スレッド: GILの影響を受けやすい
- Free-Threading導入でasyncioの役割がどう変わるかは今後の課題
- 今後10年で新しい並列処理モデルが普及するかは、実装と現場の需要次第
まとめ
- async/awaitはI/Oバウンド処理で有用だが、用途が限定的
- GILやOSレベルの制限が普及の障壁
- Python 3.14の新機能で並列処理の選択肢が大幅に拡大
- 今後はasync・Free-Threading・Multiple Interpretersの使い分けがポイント
- 現場のニーズと実装の熟成が普及のカギ