メインコンテンツへスキップ

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モデルと設計の重心」で決めるべきである。