Pythonでマルチプロセスを用いたCPUコアの効率的な利用方法

この記事では、Pythonでマルチプロセスを用いてCPUコアを効率的に利用する方法を詳しく解説します。具体的なコード例とその解説、応用例を含めています。

目次

マルチプロセスとは

マルチプロセスとは、複数のプロセスを同時に動かすことで、計算処理を効率的に行う手法です。特にCPUコアが複数ある場合、各コアにプロセスを割り当てることで、高速に計算処理を行うことが可能です。

マルチスレッドとの違い

マルチスレッドは、1つのプロセス内で複数のスレッドを動かす手法です。マルチプロセスと比較すると、リソースの共有が容易ですが、PythonではGlobal Interpreter Lock(GIL)の影響を受けるため、真の並行処理が難しい場合があります。

Pythonでのマルチプロセスの基本

Pythonの標準ライブラリである`multiprocessing`を用いて、簡単にマルチプロセスのプログラミングができます。

基本的なコード構造

以下は、`multiprocessing`を用いた簡単な例です。

from multiprocessing import Process

def my_function(number):
    print(f'Process {number}')

if __name__ == '__main__':
    processes = []
    for i in range(5):
        # プロセスの作成
        p = Process(target=my_function, args=(i,))
        # プロセスの開始
        p.start()
        processes.append(p)

    for p in processes:
        # プロセスの終了を待つ
        p.join()

コードの詳細解説

– `from multiprocessing import Process`: `multiprocessing`モジュールから`Process`クラスをインポートします。
– `def my_function(number)`: 実行させたい関数を定義します。
– `if __name__ == ‘__main__’:` : スクリプトが直接実行された場合のみ、マルチプロセスを実行します。
– `p = Process(target=my_function, args=(i,))`: `Process`クラスのインスタンスを生成し、ターゲットとなる関数と引数を設定します。
– `p.start()`: プロセスを開始します。
– `p.join()`: プロセスが終了するのを待ちます。

応用例

データの分割処理

大量のデータを分割して、各プロセスで処理する例です。

from multiprocessing import Process

def process_data(start, end, data):
    for i in range(start, end):
        data[i] = data[i] * 2

if __name__ == '__main__':
    data = list(range(100))
    chunk_size = len(data) // 4
    processes = []

    for i in range(4):
        start_index = i * chunk_size
        end_index = (i + 1) * chunk_size
        p = Process(target=process_data, args=(start_index, end_index, data))
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

    print(data)

非同期タスク

非同期に複数のAPIリクエストを送る例です。

from multiprocessing import Process
import requests

def fetch_data(api_url):
    response = requests.get(api_url)
    print(response.json())

if __name__ == '__main__':
    api_urls = ['https://jsonplaceholder.typicode.com/todos/1', 'https://jsonplaceholder.typicode.com/todos/2']
    processes = []

    for url in api_urls:
        p = Process(target=fetch_data, args=(url,))
        p.start()
        processes.append(p)

    for p in processes:
        p.join()

まとめ

Pythonでマルチプロセスを用いることで、CPUコアを効率的に活用し、高速な処理が可能です。基本的な使い方から応用例まで解説しましたので、この知識を活用して、より効率的なプログラムを作成してください。

コメント

コメントする

目次