Python の Process クラスでは、start() メソッドでプロセスを開始し、join() や terminate() で終了を制御します。プロセスのライフサイクルを正しく管理することが、安定した並列処理の鍵になります。
プロセスを開始する
start() メソッドを呼び出すと、新しいプロセスが生成されて実行を開始します。
from multiprocessing import Process def task(): print("Task running") if __name__ == "__main__": p = Process(target=task) p.start() # プロセスを開始 print("Main process continues") p.join()
start() は非同期的に動作するため、呼び出し直後に制御がメインプロセスに戻ります。
プロセスの終了を待つ
join() メソッドは、対象のプロセスが終了するまでメインプロセスをブロックします。
from multiprocessing import Process import time def slow_task(): time.sleep(2) print("Slow task finished") if __name__ == "__main__": p = Process(target=slow_task) p.start() p.join() # プロセスの終了を待つ print("Main process finished")
join() を呼ばないと、メインプロセスが先に終了してしまう可能性があります。
タイムアウト付きで待機する
join() にはタイムアウトを指定できます。
from multiprocessing import Process import time def long_task(): time.sleep(10) if __name__ == "__main__": p = Process(target=long_task) p.start() p.join(timeout=3) # 最大3秒待つ if p.is_alive(): print("Process is still running") p.terminate()
タイムアウト後もプロセスが動いている場合は、is_alive() で確認できます。
プロセスを強制終了する
terminate() メソッドでプロセスを強制終了できます。
from multiprocessing import Process import time def infinite_task(): while True: time.sleep(1) if __name__ == "__main__": p = Process(target=infinite_task) p.start() time.sleep(3) p.terminate() # 強制終了 p.join() print("Process terminated")
terminate() は SIGTERM シグナルを送信します。プロセスは直ちに終了するため、クリーンアップ処理は実行されません。
プロセスを即座に強制終了する
Python 3.7 以降では kill() メソッドも使えます。
terminate()
SIGTERM を送信する。プロセスに終了の機会を与える。
kill()
SIGKILL を送信する。即座に強制終了する。
kill() は Unix 系システムで SIGKILL を送信します。どうしても終了しないプロセスに対して使います。
プロセスの状態を確認する
プロセスの状態は is_alive() と exitcode で確認できます。
from multiprocessing import Process import time def task(): time.sleep(1) if __name__ == "__main__": p = Process(target=task) print(f"Before start: alive={p.is_alive()}, exitcode={p.exitcode}") p.start() print(f"After start: alive={p.is_alive()}, exitcode={p.exitcode}") p.join() print(f"After join: alive={p.is_alive()}, exitcode={p.exitcode}")
exitcode は正常終了なら 0、terminate() で終了した場合は負の値になります。