Pythonで複数のHTTPリクエストを並行して送信するテクニックについて詳しく解説します。特に、`requests`ライブラリと`concurrent.futures`モジュールを活用して、効率的なリクエスト処理を実現する方法をご紹介します。具体的なコード例とその解説、応用例も含めています。
なぜ並行処理が必要なのか
HTTPリクエストを連続して送信する場合、一つ一つのリクエストが完了するまで待っていると非常に時間がかかる可能性があります。並行処理を用いることで、これらのリクエストを同時に処理し、処理速度を大幅に向上させることができます。
逐次処理と並行処理の違い
逐次処理では、一つのリクエストが完了してから次のリクエストを送信します。これに対して、並行処理では複数のリクエストをほぼ同時に送信し、効率的に処理します。
基本的なコード構造
PythonでHTTPリクエストの並行処理を行う基本的なコード構造を以下に示します。
from concurrent.futures import ThreadPoolExecutor
import requests
def fetch(url):
# HTTPリクエストを送信して結果を取得
response = requests.get(url)
return response.text
with ThreadPoolExecutor() as executor:
urls = ['http://example.com/1', 'http://example.com/2']
results = list(executor.map(fetch, urls))
コードの詳細解説
– `ThreadPoolExecutor`: `concurrent.futures`モジュールに含まれるクラスで、スレッドを使った並行処理を簡単に行えます。
– `fetch`: 指定されたURLに対してHTTP GETリクエストを送信し、レスポンステキストを返します。
– `executor.map`: 指定した関数(この場合は`fetch`)を引数(`urls`)に対して並行に適用します。
応用例
応用例1: タイムアウトを設定する
def fetch_with_timeout(url):
# タイムアウトを10秒に設定してHTTPリクエストを送信
response = requests.get(url, timeout=10)
return response.text
解説
`requests.get`メソッドの`timeout`引数にタイムアウト時間を指定しています。これにより、指定時間内にレスポンスが返ってこない場合は例外が発生します。
応用例2: レスポンスをJSONとして解析する
import json
def fetch_and_parse_json(url):
# HTTPリクエストを送信してJSONレスポンスを解析
response = requests.get(url)
return json.loads(response.text)
解説
`json.loads`関数を使って、HTTPレスポンスのテキストをJSONとして解析しています。これにより、JSON形式のAPIレスポンスなどを簡単に処理できます。
まとめ
Pythonで複数のHTTPリクエストを並行して送信する方法について、基本的なコード構造と応用例を通じて詳しく解説しました。このテクニックを使うことで、より効率的なWebスクレイピングやAPIの呼び出しを実現できます。
コメント