PHPをこれまでメインに使っておりましたが、現在のプロジェクトではPythonを使用しております。
慣れないというかPHPではあまり馴染みのないマルチスレッドとマルチプロセスについて、その違いと役割について備忘としてまとめます。
基本的な理解をするためのものなので、詳しい実装方法などは説明しません。
基本的な説明
通常の処理
通常の処理であればコードは逐次実行されます。
同時に複数の処理が行われることはなく、上から順にコードが実行されていきます。
マルチプロセス (並列処理)
複数の作業者がおり、同時に二つの処理を実行するような処理方法を言います。
マルチプロセスはプロセスを二つ利用します。
プロセスとはコンピューター上で動かす処理単位を言います。PCで複数アプリケーションを使用している場合は、マルチプロセスを行っていると言えます。
マルチスレッド (並行処理)
一つの作業者ですが、他の処理の空き時間を利用して処理を実行するような処理方法のことを言います。
スレッドとはプロセスをさらに細分化したような単位です。
それぞれの得意
マルチプロセス(並列処理)
CPUバウンドが発生するような処理に使うのが良いです ⇒ 計算量が多くなってしまうもの
例)
- 大量の計算処理
- PDFを画像に変換する処理など
マルチスレッド(並行処理)
I/O(インプット/アウトプット)バウンドが発生するような処理に使うのが良いです
例)
- APIの呼び出し
- データベースへの挿入など
実装方法
どちらもconcurrent.futuresモジュールからインポートして実装することができます。
以下を見てもらえば分かりますが、記述自体はほとんど変わりません。
マルチプロセス(並列処理)
import concurrent.futures
def func1():
# func1の処理
print('func1')
def func2():
# func2の処理
print('func2')
# ProcessPoolExecutorを使用して並列処理を実行
with concurrent.futures.ProcessPoolExecutor() as executor:
# 各関数を並列に実行
executor.submit(func1)
executor.submit(func2)
マルチスレッド(並行処理)
import concurrent.futures
def func1():
# func1の処理
print('func1')
def func2():
# func2の処理
print('func2')
# ThreadPoolExecutorを使用してマルチスレッド処理を実行
with concurrent.futures.ThreadPoolExecutor() as executor:
# 各関数を並行処理で実行
executor.submit(func1)
executor.submit(func2)
今回は基礎的な実装しか書いていないのでもし詳しいことが知りたい場合は以下を参照してください