AWS Lambda関数で大量のAPIリクエストをする必要があった。1つ1つのAPIリクエストは独立しているため、高速化のために並行処理をしようと思ったが、だいぶ前にやってすっかり忘れていたのでChatGPT-4に聞いた。普通にためになったので以下に記事。
イントロ
APIリクエストの高速化は、アプリケーションのパフォーマンスを向上させる重要な要素です。特に、複数の独立したAPIリクエストを素早く実行する必要がある場合、並行処理と並列処理という2つの異なるアプローチが存在します。この記事では、これらの違いを説明し、なぜ並行処理が良いのかを解説します。また、Pythonで並行処理を実装する方法について具体的に説明し、シンプルなサンプルコードを提供します。
並列処理と並行処理の違い
まず、並列処理と並行処理という2つの概念を理解する必要があります。両者はどちらも複数のタスクを同時に実行するための手法ですが、それぞれ特定の状況において最も効果を発揮します。
- 並列処理:これは、問題を同時に解決するために複数のプロセッサまたはマルチコアプロセッサを使用するプロセスです。ここで重要なのは、タスクがそれぞれ独立して同時に実行されるということです。これは大規模な計算を高速に処理するために使用されます。
- 並行処理:並行処理は、システムが複数のタスクをほぼ同時に(または同時に見えるように)管理するプロセスです。これは一般的に、異なるタスクが交互に実行されるようにスケジューリングされる場合に起こります。
両者の主な違いは、並列処理が物理的な同時実行(つまり、複数のプロセッサ上で実際に同時に動作するタスク)を強調し、一方、並行処理は複数のタスクが交互にまたは見かけ上同時に実行される管理の問題を強調しています。これは特に、単一のプロセッサが複数のタスクを効率的に管理しなければならない場合に重要です。
APIリクエストにおける並行処理の利点
並列処理は複数のCPUコアを利用して、計算上のタスクを物理的に同時に実行します。大規模なデータセットの計算や複雑な画像処理など、CPU処理時間が長いタスクに対しては非常に有効です。しかし、APIリクエストは通常、CPUの計算処理時間よりもネットワーク遅延やサーバー応答時間が支配的なので、並列処理を使用しても、各CPUコアは大部分の時間をレスポンスを待つだけで過ごすことになり、リソースの効率的な使用には繋がりません。
したがって、APIリクエストのようなネットワークI/Oタスクの場合、通常は並行処理が適しています。ただし、APIレスポンスの後処理に計算集約的なタスク(例えば、受け取ったデータの複雑な解析や変換)が含まれる場合は、その部分を並列処理することが有用な場合があります。
Pythonでの並行処理の実装
Pythonでは標準ライブラリのconcurrent.futures
を用いて簡単に並行処理を行うことができます。以下に、HTTPリクエストを送るためのライブラリであるrequests
を使ったサンプルコードを記載します。
import requests
from concurrent.futures import ThreadPoolExecutor
# APIのURLリスト
urls = [
'https://example.com',
'https://example.com',
'https://example.com',
# etc...
]
def fetch(url):
response = requests.get(url)
return response.status_code
with ThreadPoolExecutor(max_workers=5) as executor: # 最大5つのスレッドを使う
results = list(executor.map(fetch, urls)) # 各URLに対してfetchを呼び出す
# resultsには各URLからのレスポンスが順番に格納される
for url, result in zip(urls, results):
print(f'Result from {url}: {result}')
このコードは、最大5つのスレッドを使ってAPIリクエストを並行して行なっています。その結果をresults
に格納し、その後で結果を表示しています。
まとめ
Pythonによる並行処理を利用すれば、APIリクエストの効率を大幅に向上させ、アプリケーションのパフォーマンスを改善することが可能です。ただし、並行リクエストがサーバーに負荷をかけすぎないよう注意し、適切なスレッド数を選ぶことが重要です。
寸評
普通に勉強になった。要は複数のコアを有効に使う並列処理と、コアあたりのパワーを効率的に使う並行処理という感じか。実際、一気にパフォーマンスが上がって助かった。
以下、ChatGPT-4にした質問。
- 並列処理と並行処理の違いは何ですか。
- 外部APIを同時にリクエストしたい時にふさわしいのはどちらですか。また、何故そう言えますか。
- なるほど。では、Pythonを使って、並行処理で外部APIにリクエストするサンプルコードを書いてください。
- ここまでのことを記事としてまとめてください。 独立したAPIリクエストを素早くやることが目的です。 並行処理と並列処理があることに触れてください。そしてなぜ並行処理が良いのかについてわかりやすく。 Pythonでの実装するにはどうすればよいのか具体的に記述し、シンプルなサンプルコードで挙動を確認できるようにしてください。
- APIリクエストの場合、並列処理は不適切なのだろうか?だとしたら何故だろうか?
記事は出力されたものを若干手直ししている。