requests / httpx / aiohttp 三点比較
🧭 はじめに(Why)
このページでは、Pythonにおける主要HTTPライブラリである
- requests
- HTTPX
- aiohttp
の 三点比較 を行います。
目的は「優劣を決める」ことではありません。 どの前提条件のもとで、どれを選ぶと事故らないかを言語化することです。
到達点は次の1行です。
HTTPライブラリ選択は「I/Oモデル」と「システムの重心」でほぼ決まる
🧭 比較の軸定義
なぜこの3つを比べるのか
この3つは、実務で実際に選択肢に上がりやすく、かつ 思想が明確に異なるからです。
- requests:同期HTTPの完成形
- httpx:同期/非同期の橋渡し
- aiohttp:asyncioネイティブ
意図的に比較しない軸
- ベンチマークの数値
- 「最速」かどうか
- 一時的な流行
HTTPクライアントは性能より設計適合で差が出ます。
🧠 軸別比較(思想と言語化)
1️⃣ I/Oモデルと設計思想
-
requests
- 同期I/O前提
- 人間向けAPI最優先
- 「分かりやすさ」が最大価値
-
httpx
- 同期/非同期を同一モデルで提供
- requests体験を壊さず拡張
- モダンI/O要件への適応
-
aiohttp
- asyncio前提
- 非同期世界への完全コミット
- 自由度と責任がセット
「非同期=上位互換」という理解は誤り。I/Oモデルは思想選択。
2️⃣ 学習コスト
-
requests
- 最小
- Python初心者でも読める
-
httpx
- requests経験者なら低い
- async導入時に追加学習が必要
-
aiohttp
- 高い
- asyncio・イベントループ理解が前提
学習コストは初期だけでなく、チーム展開時に効く。
3️⃣ 拡張性・将来耐性
-
requests
- 拡張は限定的
- 枯れていて安定
-
httpx
- Transport差し替えなど拡張余地あり
- 同期→非同期移行パスを確保
-
aiohttp
- 非同期Webサーバまで含めた拡張性
- 設計次第で強力だが、破壊力も大
4️⃣ 事故りやすさ
-
requests
- 事故りにくい
- ただし無限待ち(timeout未指定)には注意
-
httpx
- デフォルトは安全寄り
- async部分で設計ミスが起きやすい
-
aiohttp
- 設計を誤ると即破綻
- 局所導入・場当たりasyncは危険
aiohttpは「部分的に使う」ライブラリではない。
🗺 選択マップ(実務視点)
個人・小規模ツール
- 同期スクリプト / CLI → requests
- 「asyncになるかも」 → httpx(同期利用)
中規模アプリ・APIクライアント
- 同期主体 → requests
- 同期 + 非同期混在 → httpx
大規模・常時稼働サービス
- asyncio中心設計 → aiohttp
- 非同期クライアントのみ → httpx async
「まずrequests、必要になったらhttpx」は安全な進化ルート。
🚧 よくある選択ミス
ミス① 流行りで選ぶ
- asyncが流行っているからaiohttp
- HTTP/2だからhttpx
→ 要件が曖昧なまま複雑化
ミス② 未来要件の過剰見積もり
- 「将来スケールするかも」
- 「今は不要だが念のため」
将来の不確実性は、現在の複雑性で支払うべきではない。
ミス③ チームスキル無視
- asyncio未経験者だらけでaiohttp
- レビュー不能なasyncコード
🧾 結論
迷ったらこれ
- 同期だけで完結するなら → requests
- sync/async両睨み → httpx
- asyncio前提の世界 → aiohttp
明確に避けるべきケース
- 「非同期が良さそう」だけでaiohttp
- 同期コードの一部だけasync化
🧾 まとめ(1文で言うと)
requests / httpx / aiohttp の選択は、性能ではなく「I/Oモデルと設計の重心」で決めるべきである。