【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']]

いいなと思ったら応援しよう!