Python の Process クラスでプロセスを作成する

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() メソッドをオーバーライドして、プロセスで実行する処理を定義します。この方式は、プロセスに状態を持たせたい場合に便利です。