Python multiprocessing ライブラリ完全ガイド

Python 標準ライブラリの multiprocessing は、マルチプロセスを活用して並列処理を実現するためのツールを提供します。本記事では、multiprocessing の主要な機能とその活用方法について詳しく解説します。

1. multiprocessing ライブラリの概要

  • multiprocessing は、複数のプロセスを並列に実行するための標準ライブラリです。
  • threading と異なり、multiprocessingGIL (Global Interpreter Lock) の制約を受けません。
  • CPU バウンドのタスク(数値計算、データ処理など)に適しています。

インストール方法

multiprocessing は Python の標準ライブラリなので、追加のインストールは不要です。

import multiprocessing
--- ## 2. 主な機能と使用例 ### (1) 基本的なプロセスの作成(`Process`)
import multiprocessing
import time

def worker():
    print("プロセス開始")
    time.sleep(2)
    print("プロセス終了")

if __name__ == "__main__":
    process = multiprocessing.Process(target=worker)
    process.start()
    process.join()
**使用例:** 独立したプロセスを作成し、バックグラウンドでタスクを実行できます。 --- ### (2) 複数プロセスの並列実行(`Pool`)
import multiprocessing

def square(n):
    return n * n

if __name__ == "__main__":
    with multiprocessing.Pool(processes=4) as pool:
        results = pool.map(square, range(10))
        print(results)
**使用例:** 大量のデータを並列処理する際に有効です。 --- ### (3) プロセス間でデータを共有(`Queue`)
import multiprocessing

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

if __name__ == "__main__":
    q = multiprocessing.Queue()
    process = multiprocessing.Process(target=worker, args=(q,))
    process.start()
    process.join()
    print("受信したデータ:", q.get())
**使用例:** プロセス間でデータを安全に共有できます。 --- ### (4) 共有メモリ(`Value` と `Array`)
import multiprocessing

def worker(val):
    val.value += 1

if __name__ == "__main__":
    val = multiprocessing.Value("i", 0)
    process = multiprocessing.Process(target=worker, args=(val,))
    process.start()
    process.join()
    print("更新後の値:", val.value)
**使用例:** プロセス間で共有メモリを使用することで、データのやり取りが可能です。 --- ### (5) プロセスの同期(`Lock`)
import multiprocessing
import time

def worker(lock):
    with lock:
        print("ロック取得")
        time.sleep(1)
        print("ロック解放")

if __name__ == "__main__":
    lock = multiprocessing.Lock()
    processes = [multiprocessing.Process(target=worker, args=(lock,)) for _ in range(3)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
**使用例:** 複数のプロセスが同じリソースにアクセスする際の競合を防ぐ。 --- ### (6) マネージャーを用いたデータ共有(`Manager`)
import multiprocessing

def worker(shared_list):
    shared_list.append("データ追加")

if __name__ == "__main__":
    with multiprocessing.Manager() as manager:
        shared_list = manager.list()
        process = multiprocessing.Process(target=worker, args=(shared_list,))
        process.start()
        process.join()
        print("共有リスト:", list(shared_list))
**使用例:** 複数のプロセス間でリストや辞書などのデータを共有できます。 --- ### (7) イベントを用いたプロセス制御(`Event`)
import multiprocessing
import time

event = multiprocessing.Event()

def worker():
    print("待機中...")
    event.wait()
    print("実行開始!")

if __name__ == "__main__":
    process = multiprocessing.Process(target=worker)
    process.start()
    time.sleep(2)
    event.set()
    process.join()
**使用例:** プロセスの開始をイベントで制御する。 --- ### (8) セマフォを用いたプロセス制限(`Semaphore`)
import multiprocessing
import time

semaphore = multiprocessing.Semaphore(2)

def worker(n):
    with semaphore:
        print(f"プロセス {n} 開始")
        time.sleep(2)
        print(f"プロセス {n} 終了")

if __name__ == "__main__":
    processes = [multiprocessing.Process(target=worker, args=(i,)) for i in range(5)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
**使用例:** 同時に実行できるプロセス数を制限する。 --- ### (9) バリアを用いたプロセス同期(`Barrier`)
import multiprocessing
import time

barrier = multiprocessing.Barrier(3)

def worker(n):
    print(f"プロセス {n} 待機中...")
    barrier.wait()
    print(f"プロセス {n} 実行開始")

if __name__ == "__main__":
    processes = [multiprocessing.Process(target=worker, args=(i,)) for i in range(3)]
    for p in processes:
        p.start()
    for p in processes:
        p.join()
**使用例:** 複数のプロセスが同時に開始されるように同期する。 --- ### (10) プロセスの識別子を取得(`current_process`)
import multiprocessing

def worker():
    print("プロセス ID:", multiprocessing.current_process().pid)

if __name__ == "__main__":
    process = multiprocessing.Process(target=worker)
    process.start()
    process.join()
**使用例:** プロセスのデバッグ時に ID を取得する。 --- ## 3. `multiprocessing` の主な機能 | 機能 | 説明 | |------------------|------| | `Process` | 独立したプロセスを作成し実行 | | `Pool` | 並列処理用のワーカープール | | `Queue` | プロセス間通信に使用するキュー | | `Value` / `Array` | 共有メモリを利用したデータ共有 | | `Lock` | 排他制御のためのロック機構 | --- ## まとめ Python の `multiprocessing` ライブラリを活用すると、GIL の制約を受けずに並列処理を実行できます。データ処理や並列タスク管理に適しており、効率的なマルチプロセス処理を実現できます。🚀