この記事では、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`モジュールを高度に活用してみてはいかがでしょうか。
コメント