はじめに
星梨花ちゃんパパから全幅の信頼を寄せられている nikkieです。
PyCon JP 2024のインプットを、自分の理解を深めるために記事にしていきます。
目次
ミニトーク「PythonのHTTPクライアントツール 徹底比較」
15分のミニトーク
https://2024.pycon.jp/ja/talk/MD99N8
今日から #pyconjp2024 です!
— Tatsuki (@_kigi__) 2024年9月26日
・Recustomerのスポンサーブース
・27日 16:40から登壇https://t.co/IuNvaIjEHK
私事ですが今日で28歳になりました!
28歳1発目の大仕事、ぜひお気軽に遊びに来てください✌️
お誕生日おめでとうございました!
私のトークのinline script metadataの例でhttpxを採用しました1。
「requestsを選ばない理由に何があるか」がこちらで語られそうだったので紹介し、私も聞きに行きました。
比較表
私の理解
- requests: 成熟しており使い勝手はよい。async/await対応していない
- httpx: requestsと同じ使い勝手でasync/await対応。新参
- aiohttp: async/await対応。成熟もしている。使い勝手がややネック
私は急進派なので、httpxがまず選択肢に入ります2。
requests同等の使い勝手 + 十分な非同期対応を高く評価する文脈ってことですね #pyconjp_2 https://t.co/DQonnHNPTz
— nikkie / にっきー (@ftnext) 2024年9月27日
つぶやきコーナー
聞きながら脳内に浮かんでいたことを回収していきます。
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で並行処理していく中で、同時リクエスト数を制限したいってニーズが出てくると思います。
私は知るのに苦労したのですが、セマフォでいけます!!
async/awaitは最初にセマフォまで教えてほしかったなー
— nikkie / にっきー (@ftnext) 2024年9月27日
セマフォの概念を見出すのが独学だと大変でした
#pyconjp_1
終わりに
ミニトーク「PythonのHTTPクライアントツール 徹底比較」、発表ありがとうございました!
requestsやhttpxを知っている身でしたが、aiohttpは初めてコードを見ました。
これらについて使いこなしtipsまで知れてよかったです!
httpx、いいですよね!
- https://ftnext.github.io/2024-slides/pyconjp/pep723-inline-script-metadata-world.html#/3/1↩
- requestsだとasync/awaitに踏み出す機会が来なくなっちゃうので、httpxの認知度を上げたいと思っています。openai-pythonでも使っているんですよね↩
-
福田さんのコードの真似だと思います。ありがとうございます!
↩おー、httpxはClientを一度インスタンス化してそれを使い回すコードを最初に見てそれをまねてたけど、ドキュメントにインスタンスは1つがよいって書いてあるのか〜。学びだ #pyconjp_2
— nikkie / にっきー (@ftnext) 2024年9月27日