PythonではTrioという非同期処理用のライブラリが使い勝手が良いのですが、低レイヤーなAPIしか用意されていないので単体で利用するとけっこうつらいものがあります。幸いhttpxというhttpクライアントライブラリにTrioモードが用意されているので、そちらを利用してみました。
利用ライブラリ
requestsに似た使い勝手で、非同期処理のhttpクライアントライブラリです。Trio用のモードも用意されています。この記事で利用した当時のバージョンは0.7.8です。
ユーザーフレンドリーな非同期処理のライブラリです。当時のバージョンは0.13.0です。
コード
このようなコードになります。詳しくはhttpxの公式ドキュメントを読んでください。
基本的にはこのようなコードになります。
import httpx
from httpx.concurrency.trio import TrioBackend
import trio
async def main():
# timeoutの値はよしなに変えてください
async with httpx.AsyncClient(backend=TrioBackend(), timeout=None) as client:
response = await client.get('https://www.example.com/')
print(response)
trio.run(main)
並列でリストの内容をリクエストを送るときは、次のようなコードになると思います。 asyncio.gather
のようなリストを返すAPIは存在しないので、クロージャを使って工夫する必要あります。詳しくはこちらのStackOverflowを読んでください。
async def main():
# 並列でリクエストを送りたいurl
urls = ['https://www.example.com/', 'https://www.example2.com/']
results = []
async def _inner(client, url):
response = await client.get(url)
results.append(response)
async with httpx.AsyncClient(backend=TrioBackend(), timeout=None) as client:
async with trio.open_nursery() as nursery:
for url in urls:
nursery.start_soon(_inner, client, url)
print(results)
参考記事
Trioに関して日本語で読みたい方はこちらでどうぞ。この記事では伝わらなかったと思うのですが、Trioはpytestとの連携なども考慮されていて便利なライブラリなので、ぜひ使ってみてください。