【Python】MultiProcessとMultiThreadを同時に行うサンプルプログラムMOME
MultiProcessは並行処理で、複数コアを同時に使うイメージ。
MultiThreadは並列処理で、1コアで複数の処理を順番に行うイメージ。
グローバル変数は使用できないので、共有マネージャーを用いて、親と子のプロセスにおける変数を共有する。主にリストと辞書が利用できる。
ちなみにサンプルプログラムでは、1つ目の値だけ更新してみている。
注意点として、COMポートなどを扱う場合は、どの1つのプロセスでアクセスするか決めなければならない。親プロセスでアクセスしたら、接続を切断するまで、子プロセスではアクセスできない。
また、
if __name__ == '__main__':
は必須。
鍵かっこ、丸かっこにも要注意。
とりあえず実行してみたら、理解できる。
import threading
import multiprocessing as mp
import time
def func1(d,l):
time.sleep(1)
print(f"func1:{d},{l}")
d["a"] += 100
def func2(d,l):
time.sleep(2)
print(f"func2:{d},{l}")
d["a"] += 100
def func3(d,l):
time.sleep(3)
print(f"func3:{d},{l}")
d["a"] += 100
def func(d,l):
# 1つの子プロセス上で、マルチスレッドを実行。
# 親プロセス上でマルチスレッドをやりたかったら、p1.start()とp0.join()の間に、このような関数を挟む。
t1 = threading.Thread(target = func1,args=[d,l])
t1.setDaemon(True)
t1.start()
t2 = threading.Thread(target = func2,args=[d,l])
t2.start()
t2.join()
if __name__ == '__main__':
# 辞書
d = mp.Manager().dict()
d["a"] = 1
d["b"] = "test1"
d["c"] = [2,"test2"]
# リスト
l = mp.Manager().list()
l.append(3)
l.append("test3")
l.append([4,"test4"])
# 2つの子プロセスを作成。
p0 = mp.Process(target = func, args=[d,l]) # argsは、片方のみでも良いし、無くてもいい。
p1 = mp.Process(target = func3, args=[d,l]) # argsは、片方のみでも良いし、無くてもいい。
p0.start()
p1.start()
p0.join()
p1.join()
print(f"final:{d},{l}")
# 出力
# func1:{'a': 1, 'b': 'test1', 'c': [2, 'test2']},[3, 'test3', [4, 'test4']]
# func2:{'a': 101, 'b': 'test1', 'c': [2, 'test2']},[3, 'test3', [4, 'test4']]
# func3:{'a': 201, 'b': 'test1', 'c': [2, 'test2']},[3, 'test3', [4, 'test4']]
# final:{'a': 301, 'b': 'test1', 'c': [2, 'test2']},[3, 'test3', [4, 'test4']]