我有大约100个流程。每个进程包含10个输入(逻辑表达式),每个进程的任务是找到最快的启发式算法来解决每个逻辑输入(我有大约5个启发式算法)。
当我单独运行每个进程时,结果与我并行运行所有进程时的结果不同(使用python p1.py& python p2.py& ... ..)。例如,当单独运行进程时,输入1(在p1中)将第一个启发式算法作为最快的方法找到,但是当并行时,相同的输入会更快地找到第5个启发式算法!
原因可能是CPU会在并行进程之间切换并与时间混乱,因此无法给出每个启发式算法花费的时间来解决输入?
解决办法是什么?可以将进程数减少一半来减少错误结果吗? (我在服务器上运行我的程序)
答案 0 :(得分:1)
操作系统必须在少得多的CPU上安排所有进程。为此,它在每个CPU上运行一个进程一小段时间。之后,操作系统会调度流程以让其他流程运行,以便为流程提供合理的运行时间。因此,每个进程都必须等待CPU上的运行槽。那些等待时间取决于等待运行的其他进程的数量,几乎无法预测。
如果您使用时钟时间进行测量,等待时间将污染您的测量值。为了更精确的测量,您可以向操作系统询问该过程使用的CPU时间。函数time.process_time()就是这样做的。
在流程之间切换需要花费时间。访问相同资源(文件,硬盘,CPU缓存,内存等)的多个进程需要花费时间。对于CPU绑定进程,运行进程数量级比CPU多,这将减慢执行速度。通过启动略少于CPU的进程,您将获得更好的结果。备用CPU仍然可用于操作系统或其他一些不相关的程序所需的工作。