Python での非同期リクエスト

Zeeshan Afridi 2023年6月21日
  1. Python での非同期リクエスト
  2. Python で非同期リクエストを使用することの重要性
  3. Python で非同期リクエストを作成する最も簡単な方法
  4. Python での非同期リクエストの処理
  5. 非同期リクエストに必要な Python ライブラリ
  6. 非同期リクエストと通常のリクエスト
  7. Python での非同期リクエスト
Python での非同期リクエスト

今日は、非同期リクエストについて学びます。 この議論は、Python で非同期リクエストを記述する方法を確認するためのコード例につながります。

Python での非同期リクエスト

非同期リクエストは、私たちのシステムの心臓部です。 それらは次のように考えることができます。

ユーザーがサイト (Web サイトまたは Web アプリ) を読み込むと、ユーザーはすぐにコンテンツを見始めます。 しかし、まだ準備が整っていません。 そのため、ユーザーがページの操作を続けている間、コンテンツをバックグラウンドで非同期に読み込みます。

これらの要求は、応答を待っている間、後続のコードの実行をブロックしません。 つまり、リクエストの処理中に他のコードを実行し続けることができます。

API 呼び出しなど、応答に時間がかかる外部リソースを処理する場合に役立ちます。 また、リクエストの処理中に UI を更新し続けることができるため、コードの応答性を高めることもできます。

Python で非同期リクエストを使用することの重要性

非同期リクエストは、Python アプリケーションのパフォーマンスを向上させる優れた方法です。 リクエストが行われると、Python インタープリターはリクエストの処理中に他のコードを実行し続けることができます。

特に大量のリクエストを行うアプリケーションでは、速度が大幅に向上する可能性があります。 ただし、非同期リクエストを使用する際に覚えておくべきいくつかの重要な点を次に示します。

  1. まず、同時に多くのリクエストを送信しないようにする必要があります。 リクエストが多すぎると、通訳者は圧倒されて遅くなる可能性があります。
  2. 次に、エラーを処理する準備をする必要があります。 リクエストが失敗した場合、インタープリターはコードの実行を続行できません。

全体として、非同期リクエストは、Python アプリケーションのパフォーマンスを向上させる優れたツールです。 ただし、慎重に使用してください。 アプリケーションをより高速かつスムーズに実行するのに役立ちます。

Python で非同期リクエストを作成する最も簡単な方法

非同期リクエストは、asyncio モジュールを使用して簡単に作成できます。 さらに、python の asyncio ライブラリは、非同期コードを作成するためのツールを提供します。 たとえば、asyncio.sleep() を使用してコルーチンを一時停止し、asyncio.wait() を使用してコルーチンが完了するのを待つことができます。

非同期リクエストを作成するには、まずコルーチンを作成する必要があります。 asyncio.ensure_future() 関数を使用してそれを行うことができます。 コルーチンを作成したら、asyncio.sleep() 関数を使用して一時停止し、asyncio.wait() 関数を使用してコルーチンが完了するのを待ちます。

Python での非同期リクエストの処理

まず、Python で非同期リクエストを実行する場合は、次のコマンドを使用して aiohttp の Python ライブラリをインストールする必要があります。

pip install aiohttp

非同期リクエストを使用して、Python アプリケーションのパフォーマンスを向上させることができます。 リクエストを並行して行うことで、プロセスを劇的にスピードアップできます。

Python で非同期リクエストを処理するには、いくつかの方法があります。 最も人気があるのは asyncio ライブラリです。 このライブラリは、async リクエストを処理するための強力なツールを提供します。

もう 1つの一般的なオプションは、grequests ライブラリです。 このライブラリは asyncio よりも少し使いやすいですが、同様に効果的です。

どのオプションを選択するかは、特定のニーズによって異なります。 しかし、どちらを選択しても、リクエストを非同期にすることで、パフォーマンスが大幅に向上することは間違いありません。

import grequests

urls = [
    "http://www.heroku.com",
    "http://tablib.org",
    "http://httpbin.org",
    "http://python-requests.org",
    "http://kennethreitz.com",
]

rs = (grequests.get(u) for u in urls)
grequests.map(rs)

非同期リクエストに必要な Python ライブラリ

非同期リクエストを作成するために、多数の Python ライブラリを使用できます。 最も人気のあるものは aiohttpasyncio です。

非同期リクエスト用のaiohttpライブラリ

aiohttp は、非同期 HTTP リクエストを作成できるようにするライブラリです。 asyncioの上に構築され、HTTP リクエストを作成するためのシンプルなインターフェースを提供します。

非同期リクエスト用のasyncioライブラリ

asyncio は Python での非同期プログラミングをサポートするライブラリです。 これにより、非同期コードを記述できるようになり、asyncioをサポートするライブラリを簡単に使用できるようになります。

aiohttpasyncio はどちらも PyPI で利用でき、pip を使用してインストールできます。

import asyncio
import aiohttp
import json

from text_api_config import apikey

非同期リクエストと通常のリクエスト

サーバーへのリクエストには、非同期と通常の 2 種類があります。 ユーザーがまだページを操作している間に、バックグラウンドで非同期リクエストが行われます。 通常のリクエストは、ページの読み込み中に行われます。

非同期リクエストは通常、ページの読み込みをブロックしないため、通常のリクエストよりも高速で効率的です。 ただし、実装がより複雑になる可能性があり、すべてのブラウザーが常にそれらをサポートしているわけではありません。

コード例:

import requests
import time

start_time = time.time()

for number in range(1, 151):
    url = f"https://pokeapi.co/api/v2/pokemon/{number}"
    resp = requests.get(url)
    pokemon = resp.json()
    print(pokemon["name"])

print("--- %s seconds ---" % (time.time() - start_time))

出力:

bulbasaur
ivysaur
venusaur
....
dragonair
dragonite
mewtwo
--- 68.17992424964905 seconds

Python の asyncio モジュール

asyncio は Python での並行プログラミング用のモジュールです。 並行スレッド、タスク、およびイベントを管理するためのフレームワークを提供します。 asyncio は、複数のタスクを同時に実行できるプログラムを作成するために使用されます。

asyncio は、コルーチンの概念に基づいています。 コルーチンは、その実行を一時停止し、制御を呼び出し元に戻すことができる関数です。 複数のコルーチンを同時に実行できます。

asyncioは、イベント ループ、タスク スケジューラ、並行データ構造など、コルーチンを管理するためのツールを提供します。

asyncio は並行プログラムを効率的に作成する方法です。 使いやすく、大規模なプログラムに拡張できます。 asyncioは、複数のタスクを同時に必要とするプログラムに最適です。

コード例:

import asyncio
import aiohttp
import json
from text_api_config import apikey


async def gather_with_concurrency(n, *tasks):
    semaphore = asyncio.Semaphore(n)

    async def sem_task(task):
        async with semaphore:
            return await task

    return await asyncio.gather(*(sem_task(task) for task in tasks))

Python の aiohttp モジュール

aiohttp モジュールは、Python 用の非同期 HTTP クライアント/サーバーです。 asyncio 上に構築され、HTTP を操作するためのシンプルな API を提供します。

aiohttp モジュールを使用すると、Python で HTTP を簡単に操作できます。 HTTP リクエストとレスポンスの送受信を簡単にするシンプルな API を提供します。

aiohttp モジュールは、非同期 HTTP サーバーを実行する方法も提供します。

import asyncio
import aiohttp
import json
from text_api_config import apikey


async def main():
    conn = aiohttp.TCPConnector(limit=None, ttl_dns_cache=300)
    session = aiohttp.ClientSession(connector=conn)
    urls = [summarize_url, ner_url, mcp_url]
    conc_req = 3

Python での非同期リクエスト

コード例:

import queue


def task1(name, s_queue):
    if s_queue.empty():
        print(f"Task {name} has nothing to do")
    else:
        while not s_queue.empty():
            cnt = s_queue.get()
            total = 0
            for x in range(cnt):
                print(f"Task {name} is working now.")
                total += 1
            print(f"Task {name} is working with a total of: {total}")


def s_async():
    s_queue = queue.Queue()
    for work in [2, 5, 10, 15, 20]:
        s_queue.put(work)
    tasks = [
        (task1, "Async1", s_queue),
        (task1, "Async2", s_queue),
        (task1, "Async3", s_queue),
    ]
    for t, n, q in tasks:
        t(n, q)


if __name__ == "__main__":
    s_async()

出力:

Task Async1 is running now.
Task Async1 is running with a total of: 2
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 5
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 10
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 15
Task Async1 is running now
...
Task Async1 is running now.
Task Async1 is running with a total of: 20
Task Async3 has nothing to do
著者: Zeeshan Afridi
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

関連記事 - Python Async