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