Python でマルチプロセスを使うには、multiprocessing モジュールの Process クラスを使います。Process クラスはスレッドの Thread クラスと似た API を持っており、直感的に扱えます。
基本的な使い方
Process クラスのコンストラクタに target 引数で実行したい関数を指定します。
from multiprocessing import Process def say_hello(): print("Hello from child process!") if __name__ == "__main__": p = Process(target=say_hello) p.start() p.join()
start() でプロセスを開始し、join() で終了を待ちます。
Process クラスの主な引数
Process のコンストラクタには以下の引数を指定できます。
| target | プロセスで実行する関数 |
| args | 関数に渡す位置引数(タプル) |
| kwargs | 関数に渡すキーワード引数(辞書) |
| name | プロセスの名前 |
| daemon | デーモンプロセスかどうか |
引数付きの関数を実行する
args にタプルを渡すことで、関数に引数を渡せます。
from multiprocessing import Process def greet(name, count): for i in range(count): print(f"Hello, {name}! ({i + 1})") if __name__ == "__main__": p = Process(target=greet, args=("Alice", 3)) p.start() p.join()
引数が 1 つの場合は args=("Alice",) のようにカンマを忘れないようにしましょう。カンマがないとタプルとして認識されません。
複数のプロセスを作成する
リストを使って複数のプロセスを管理できます。
from multiprocessing import Process def worker(n): print(f"Worker {n} started") if __name__ == "__main__": processes = [] for i in range(4): p = Process(target=worker, args=(i,)) processes.append(p) p.start() for p in processes: p.join()
各プロセスは独立して動作するため、出力の順番は実行ごとに異なる場合があります。
Process をサブクラス化する
Process クラスを継承して、独自のプロセスクラスを作ることもできます。
from multiprocessing import Process class MyProcess(Process): def __init__(self, name): super().__init__() self.name = name def run(self): print(f"Process {self.name} is running") if __name__ == "__main__": p = MyProcess("Worker-1") p.start() p.join()
run() メソッドをオーバーライドして、プロセスで実行する処理を定義します。この方式は、プロセスに状態を持たせたい場合に便利です。