PR

Pythonのmultiprocessingモジュール完全ガイド【並列処理でパフォーマンス最大化】

Pythonのmultiprocessingモジュール:並列処理の徹底ガイド【実例付き】

Pythonのmultiprocessingモジュール:並列処理の徹底ガイド【実例付き】

Pythonの並列処理を学び、プログラムのパフォーマンスを向上させましょう。

multiprocessingモジュールの基本

Pythonのmultiprocessingモジュールを使用すると、CPUのコアをフル活用して効率的に並列処理を実現できます。

  • GILの制約を回避し、真の並列処理を実現
  • プロセス間でデータを共有する手段が提供される
  • CPUバウンドのタスクに最適

multiprocessingの基本的な使い方

例1: 基本的な並列処理

from multiprocessing import Process

def worker():
    print("ワーカーが実行されています!")

if __name__ == "__main__":
    p = Process(target=worker)
    p.start()
    p.join()

例2: プロセスプールを使用

from multiprocessing import Pool

def square(n):
    return n * n

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

例3: 共有メモリの使用

from multiprocessing import Value, Process

def increment(shared_value):
    shared_value.value += 1

if __name__ == "__main__":
    val = Value('i', 0)
    p = Process(target=increment, args=(val,))
    p.start()
    p.join()
    print(val.value)

例4: マルチプロセスでのロックの使用

from multiprocessing import Process, Lock

def worker(lock, num):
    with lock:
        print(f"プロセス {num} が実行されています!")

if __name__ == "__main__":
    lock = Lock()
    processes = [Process(target=worker, args=(lock, i)) for i in range(5)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()

例5: マネージャーを使った共有リストの活用

from multiprocessing import Process, Manager

def worker(shared_list, value):
    shared_list.append(value)

if __name__ == "__main__":
    with Manager() as manager:
        shared_list = manager.list()
        processes = [Process(target=worker, args=(shared_list, i)) for i in range(5)]
        for p in processes:
            p.start()
        for p in processes:
            p.join()
        print(list(shared_list))

multiprocessingの実務的な活用例

例1: 大量のデータを並列処理

from multiprocessing import Pool
import time

def compute(x):
    time.sleep(1)
    return x * x

if __name__ == "__main__":
    with Pool(4) as p:
        results = p.map(compute, range(10))
        print(results)

例2: キューを利用したプロセス間通信

from multiprocessing import Process, Queue

def worker(q):
    q.put("データ送信")

if __name__ == "__main__":
    q = Queue()
    p = Process(target=worker, args=(q,))
    p.start()
    print(q.get())
    p.join()

例3: 並列Webスクレイピング

from multiprocessing import Pool
import requests

def fetch_url(url):
    response = requests.get(url)
    return url, response.status_code

if __name__ == "__main__":
    urls = ["https://example.com" for _ in range(5)]
    with Pool(5) as p:
        results = p.map(fetch_url, urls)
        print(results)

例4: 画像処理の並列化

from multiprocessing import Pool
from PIL import Image

def process_image(image_path):
    img = Image.open(image_path)
    img = img.convert("L")
    img.save("processed_" + image_path)

if __name__ == "__main__":
    image_files = ["image1.jpg", "image2.jpg", "image3.jpg"]
    with Pool(3) as p:
        p.map(process_image, image_files)

例5: データベースクエリの並列実行

from multiprocessing import Pool
import sqlite3

def fetch_data(query):
    conn = sqlite3.connect("example.db")
    cursor = conn.cursor()
    cursor.execute(query)
    result = cursor.fetchall()
    conn.close()
    return result

if __name__ == "__main__":
    queries = ["SELECT * FROM users", "SELECT * FROM orders"]
    with Pool(2) as p:
        results = p.map(fetch_data, queries)
        print(results)

次に読むべき記事

まとめ

Pythonのmultiprocessingモジュールを活用することで、並列処理を容易に実装し、プログラムのパフォーマンスを最大化できます。

さらにPythonを学びたい方は、以下の記事もチェック!

Python完全ガイドを見る

© 2025 Pythonガイド – すべての権利を保有

コメント