Pythonのrequests
ライブラリはHTTPリクエストを簡単に行うためのインターフェースを提供しています。マルチスレッドを使用すると、複数のリクエストを同時に送信することでリクエストの速度を向上させることができます。
concurrent.futuresとrequestsを使用した方法
Pythonでよく使われるライブラリであるrequests
をマルチスレッド化する最も直感的な方法は、requests
を何らかの並列実行形式でラップすることです。以下に、requests
を使用してHTTP GET呼び出しを行う基本的なメソッドを示します。
import requests
from concurrent.futures import ThreadPoolExecutor
def fetch_url(url):
response = requests.get(url)
return response
with ThreadPoolExecutor(max_workers=100) as executor:
future = executor.submit(fetch_url, 'http://example.com')
response = future.result()
print(response.status_code)
このコードでは、ThreadPoolExecutor
を使用して並列化を追加しています。max_workers
を他の値に設定して試すことができます。
asyncioとaiohttpを使用した方法
Pythonのasyncio
を使用してHTTP呼び出しを行う新しく、より堅牢な方法があります。以下に、基本的なHTTP GET呼び出しとマルチスレッド版を示します。
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch_url(session, 'http://example.com')
print(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
このコードでは、ClientSession
オブジェクトをこれらのメソッドに追加で渡す必要があります。このClientSession
は、メイン関数で後で初期化されます。
ベンチマーク
aiohttp
はThreadPoolExecutor
よりも約2.1 – 2.3倍高速であることがベンチマーク結果からわかります。ただし、PCのマルチスレッド能力、接続速度、呼び出すURL、サーバーの負荷とパフォーマンスなど、これらのリクエスト速度に影響を与える要素は多く存在します。しかし、一般的に、同様の条件ではaiohttp
の方がより良く、より速く動作することが確認されています。
以上がPythonでHTTPリクエストをマルチスレッド化する方法についての概要です。これらの方法を試して、自分のニーズに最適な方法を見つけてみてください。