multiprocessingモジュールを使って、threadingモジュールと同じように並列処理を記述できる。
multiprocessing.Processクラスの生成時にtarget引数に指定する関数を、別プロセスで並列的に実行できる。
import multiprocessing
import time
def worker(interval):
for n in range(3):
time.sleep(interval)
print("%s --> %d" % (multiprocessing.current_process().name, n))
p1 = multiprocessing.Process(name="a", target=worker, args=(1, ))
p2 = multiprocessing.Process(name="b", target=worker, args=(2, ))
p1.start()
p2.start()
threadingと同じように書けるように、作られているためほとんど同じように記述できる。生成するのがthreading.Threadか、multiprocessing.Processかの違い。
multiprocessingを使った場合は、サブプロセスが生成されて実行できる。(cpythonの場合)threadingではマルチコアを活かした並行処理ができないが、multiprocessingの場合は独立したプロセスになるのでマルチコアを活かした実行が可能になる。
では、threadingではなくいつもmultiprocessingを使えばいいのかというとそうはならない。
同じように記述はできるが、worker関数を実行するのは別プロセスになるので、メインプロセスとサブプロセスの間で変数を共有したりすることができない。サブプロセスで実行した結果をメインプロセスで受け取ったり、サブプロセスの実行中の状態を取得したりするには、プロセス間通信の仕組みが必要になって複雑になる。
threadの場合は、同一のプロセスで動くのでメモリ空間は共有してあり、ロックなどの処理は必要になるもののデータのやり取りは簡単にできる。
参考:17.2. multiprocessing — プロセスベースの並列処理