Pythonで「並行処理」を実現する方法はいくつもあります。その中でも特に利用頻度が高いのが「asyncio」と「multiprocessing」です。
しかし、名前は知っていても「どちらを選べばいいのか?」「速度や負荷の違いは?」と悩む方も多いのではないでしょうか。
この記事では、両者の違いと得意分野を明確にし、具体的なコード例を交えて使い分けのポイントを紹介します。
asyncio
はPython標準ライブラリで提供されている非同期処理の仕組みです。特に ネットワーク通信やファイルI/Oなど、待ち時間が発生する処理に強い のが特徴です。
以下は、非同期で複数のURLにアクセスする例です。
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
async def main():
urls = ["https://example.com", "https://python.org", "https://openai.com"]
tasks = [fetch(url) for url in urls]
results = await asyncio.gather(*tasks)
for i, r in enumerate(results):
print(f"URL{i+1} length:", len(r))
asyncio.run(main())
このように、I/Oの待ち時間を活用し効率的に処理を進めることができます。
一方、multiprocessing
は複数のプロセスを立ち上げ、CPUをフル活用して並列処理を行うライブラリです。特に 計算量の多い処理(CPUバウンド処理) に適しています。
以下は、素数判定を並列で処理する例です。
from multiprocessing import Pool
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
if __name__ == "__main__":
numbers = [10**7 + i for i in range(10)]
with Pool() as pool:
results = pool.map(is_prime, numbers)
print(results)
このコードでは複数CPUコアを利用して高速に計算を分散しています。
まとめると、次のように判断するとよいでしょう。
- asyncio:Webスクレイピング、APIアクセス、ファイル入出力など
- multiprocessing:画像処理、数値計算、機械学習の前処理など
実務では両方を組み合わせることも多く、例えば「APIでデータを非同期で取得し、その後並列処理で分析する」といった流れが自然に使い分けられます。
Pythonの並行処理にはさまざまな選択肢がありますが、asyncio
と multiprocessing
を正しく理解し、使い分けることで大きな効率化が可能です。
本記事で紹介した例を参考に、ぜひ自分のプロジェクトに適した方法を選んでみてください。
また、APIの仕様変更やうまく動作しないなどがありましたら、遠慮なくコメントまでお寄せください!