4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonその4Advent Calendar 2019

Day 9

Trio+httpxで気軽にPythonの非同期httpクライアントを実装する

Last updated at Posted at 2019-12-09

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との連携なども考慮されていて便利なライブラリなので、ぜひ使ってみてください。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?