【Python】Pythonで学ぶ「asyncio」と「マルチプロセス」の使い分け

はじめに

Pythonで「並行処理」を実現する方法はいくつもあります。その中でも特に利用頻度が高いのが「asyncio」と「multiprocessing」です。

しかし、名前は知っていても「どちらを選べばいいのか?」「速度や負荷の違いは?」と悩む方も多いのではないでしょうか。

この記事では、両者の違いと得意分野を明確にし、具体的なコード例を交えて使い分けのポイントを紹介します。

asyncioとは?(I/Oバウンドに強い非同期処理)

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バウンドに強い並列処理)

一方、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の並行処理にはさまざまな選択肢がありますが、asynciomultiprocessing を正しく理解し、使い分けることで大きな効率化が可能です。

本記事で紹介した例を参考に、ぜひ自分のプロジェクトに適した方法を選んでみてください。

また、APIの仕様変更やうまく動作しないなどがありましたら、遠慮なくコメントまでお寄せください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です