前提・実現したいこと
pythonのmultiprocessingを使って並列処理をしたいのですが、
下のようなコードだと、マルチスレッドのようにmainプロセスに遅延が発生してしまいます。
具体的には、
mainで
print(f'1周の所要時間:{elapsed_time}\n')
を実行しているのですが、サブプロセスが1この時とサブプロセスが2こ3この時で平均的な所要時間が多くなってしまいます。
使えるCPUの範囲でサブプロセスをある程度増やしても完全な並列処理ができるようにするにはどのようにすればいいのでしょうか。
わかる方がいましたらコメントお願いします。
発生している問題・エラーメッセージ
multiprocessingを使っているのに、マルチスレッドのようにmainプロセスに遅延が発生する。
一般的なマルチプロセスだとサブプロセスの数にかかわらず、mainの一周の所要時間はほとんど変化がないはずです、、
//サブプロセス1個の場合 1周の所要時間:0.7286965847015381 main process... 1周の所要時間:0.45372629165649414 main process... 1周の所要時間:0.5691251754760742 main process... sub process... 1周の所要時間:0.5207698345184326
//サブプロセス3個の場合 1周の所要時間:1.465956449508667 main process... 1周の所要時間:1.0600461959838867 main process... 1周の所要時間:1.0374970436096191 main process... sub process... 1周の所要時間:1.293185949325561
該当のソースコード
python
1import os 2import datetime 3import json 4import time 5import asyncio 6from multiprocessing import Process, Queue, freeze_support, set_start_method 7import sys 8import random 9 10 11def sub_process(q): 12 while q.qsize()!=0: 13 print('sub process...') 14 queue_data=q.get() 15 if queue_data=='sleep': 16 print('5秒待ちます...') 17 time.sleep(5) 18 else: 19 hoge.hoge(queue_data) # キューに入れたデータをcsvに変換して保存します 20 print('sub processを終了します.') 21 sys.exit(0) 22 23 24def main(q): 25 try: 26 while True: 27 print('main process...') 28 start = time.time() 29 fuga = fuga.fuga() #センサから値を取ってきます 30 31 q.put(fuga) 32 print(f'main process queue size: {q.qsize()}') 33 elapsed_time=time.time()-start 34 print(f'1周の所要時間:{elapsed_time}\n') 35 #time.sleep(2) 36 except KeyboardInterrupt: 37 print('プログラムを終了します.') 38 39 40if __name__ == '__main__': 41 print(f'使用可能なCPU数:{len(os.sched_getaffinity(0))}') 42 #freeze_support() 43 #set_start_method('spawn') 44 q=Queue() 45 q.put('sleep') 46 q.put('sleep') 47 q.put('sleep') 48 p_sub = Process(target=sub_process, args=(q,)) 49 p_subsub = Process(target=sub_process, args=(q,)) 50 p_subsubsub = Process(target=sub_process, args=(q,)) 51 p_main = Process(target=main, args=(q,)) 52 p_sub.start() 53 p_subsub.start() 54 p_subsubsub.start() 55 p_main.start() 56 p_main.join() 57 p_sub.join() 58 p_subsub.join() 59 p_subsubsub.join()
##環境
OS: Raspberrypi OS
デバイス: ラズパイ4

回答1件
あなたの回答
tips
プレビュー