nikkie-ftnextの日記

イベントレポートや読書メモを発信

#pyconjp2024 トークメモ「PythonのHTTPクライアントツール 徹底比較」、httpxいいですよね!

はじめに

星梨花ちゃんパパから全幅の信頼を寄せられている nikkieです。

PyCon JP 2024のインプットを、自分の理解を深めるために記事にしていきます。

目次

ミニトークPythonのHTTPクライアントツール 徹底比較」

15分のミニトーク
https://2024.pycon.jp/ja/talk/MD99N8

お誕生日おめでとうございました!
私のトークのinline script metadataの例でhttpxを採用しました1
「requestsを選ばない理由に何があるか」がこちらで語られそうだったので紹介し、私も聞きに行きました。

比較表

私の理解

  • requests: 成熟しており使い勝手はよい。async/await対応していない
  • httpx: requestsと同じ使い勝手でasync/await対応。新参
  • aiohttp: async/await対応。成熟もしている。使い勝手がややネック

私は急進派なので、httpxがまず選択肢に入ります2

つぶやきコーナー

聞きながら脳内に浮かんでいたことを回収していきます。

urllib3はrequestsが依存していますね(ゆえにrequestsとダウンロード数は重なる)。
https://github.com/psf/requests/blob/v2.32.3/setup.py#L64

aiohttpはあまり触る機会なかったのですが、サンプルコードを見たところ、requestsよりは難しくなるのですね
https://docs.aiohttp.org/en/stable/#client-example

async with aiohttp.ClientSession() as session:
    async with session.get('http://python.org') as response:
        html = await response.text()

urllibよりは高いレベルで操作できるのだと思いますが、requestsやhttpxはさらに高い操作レベルという感じですね

HTTP通信はI/Oバウンドな処理。
requestsはasync/awaitに対応していませんが、I/Oバウンドな処理にはマルチスレッドも有効です。
私も過去にThreadPoolExecutorを素振りしていました。

httpxに言及した過去記事

推しているので、取り上げた記事がいくつかあります

httpxは最初に見たコードをマネていた3のですが、トークで知ったインスタンスの使い回しというプラクティスを意識せずに採用していました!

https://www.python-httpx.org/async/#opening-and-closing-clients

Warning
In order to get the most benefit from connection pooling, make sure you're not instantiating multiple client instances - for example by using async with inside a "hot loop". This can be achieved either by having a single scoped client that's passed throughout wherever it's needed, or by having a single global client instance.

httpxやrequestsの引数の深堀り

httpxのtimeoutはきめ細かく設定できます!

httpxで並行処理していく中で、同時リクエスト数を制限したいってニーズが出てくると思います。
私は知るのに苦労したのですが、セマフォでいけます!!

終わりに

ミニトークPythonのHTTPクライアントツール 徹底比較」、発表ありがとうございました!
requestsやhttpxを知っている身でしたが、aiohttpは初めてコードを見ました。
これらについて使いこなしtipsまで知れてよかったです!

httpx、いいですよね!


  1. https://ftnext.github.io/2024-slides/pyconjp/pep723-inline-script-metadata-world.html#/3/1
  2. requestsだとasync/awaitに踏み出す機会が来なくなっちゃうので、httpxの認知度を上げたいと思っています。openai-pythonでも使っているんですよね
  3. 福田さんのコードの真似だと思います。ありがとうございます!