Pythonでmultiprocessingモジュールを高度に活用する方法

この記事では、Pythonの`multiprocessing`モジュールの高度な利用法について深く掘り下げます。このモジュールは、CPUバウンドタスクで並列処理を効率的に行うための強力な手段です。具体的なコード例、その解説、さらには応用例を2つ以上も取り入れて説明します。

目次

基本的な`multiprocessing`の使い方

まずは、`multiprocessing`モジュールの基本的な使い方から見ていきましょう。

from multiprocessing import Process

def hello_world():
    print("Hello, World!")

if __name__ == "__main__":
    process = Process(target=hello_world)
    process.start()
    process.join()

この基本的な例では、`hello_world`という関数を子プロセスで実行しています。

このコードのポイント

– `Process`クラスを使ってプロセスを作成
– `start()`メソッドでプロセスを開始
– `join()`メソッドでプロセスが終了するまで待機

高度な利用法1: プロセス間通信(IPC)

ここでは、プロセス間通信(IPC)を実現する`Queue`と`Pipe`について見ていきます。

`Queue`の使用例

from multiprocessing import Process, Queue

def worker(q):
    q.put("Hello from worker process")

if __name__ == "__main__":
    my_queue = Queue()
    process = Process(target=worker, args=(my_queue,))
    process.start()
    process.join()
    
    message = my_queue.get()
    print(f"Main Process received: {message}")

このコードの詳細解説

1. `Queue`オブジェクトを生成して、`my_queue`に格納
2. `worker`関数では、この`Queue`にデータを追加(`put`)
3. メインプロセスで`Queue`からデータを取得(`get`)して表示

高度な利用法2: プールを用いた並列処理

プールを用いると、複数のタスクを効率よく処理することができます。

`Pool`の使用例

from multiprocessing import Pool

def square(n):
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4]
    with Pool(4) as pool:
        results = pool.map(square, numbers)
    print(results)

このコードの詳細解説

1. `Pool`クラスを使用して、プロセスのプールを作成
2. `map`関数で、各プロセスに処理を分散
3. 各プロセスが計算を終えたら、その結果をリストとして取得

応用例1: 大量のデータ処理

大量のデータを効率よく処理する一例を見てみましょう。

from multiprocessing import Pool

def compute(data):
    return sum(data)

if __name__ == "__main__":
    dataset = [list(range(10000 * i, 10000 * (i + 1))) for i in range(10)]
    with Pool(10) as pool:
        results = pool.map(compute, dataset)
    print(sum(results))

応用例2: ファイル入出力

複数のテキストファイルを同時に処理する例です。

import os
from multiprocessing import Pool

def write_to_file(filename):
    with open(filename, 'w') as f:
        for i in range(1000):
            f.write(str(i) + '\n')

if __name__ == "__main__":
    filenames = [f"file_{i}.txt" for i in range(10)]
    with Pool(10) as pool:
        pool.map(write_to_file, filenames)

まとめ

`multiprocessing`モジュールは、Pythonでの並列処理を効率よく行うための重要なモジュールです。基本的な使い方から、高度なプロセス間通信、プールを用いた並列処理、さらには応用例に至るまで、多角的にその使い方を解説しました。これを機に、`multiprocessing`モジュールを高度に活用してみてはいかがでしょうか。

コメント

コメントする

目次