我的笔记本电脑有4个核心,经过一些简单的测试后,我发现当我使用4个或更多作业的多处理时,我的CPU使用率为100%,3个作业约占75%,2个约占50%工作和25%与1份工作。这对我来说非常有意义。
然后我发现我的程序在多处理过程中运行的速度提高了4倍,但我认为它不应该总是快4倍。
例如,如果我正在运行5个作业,那么我的第5个作业是否应该排队并且只有在完成这4个作业中的任何一个后才能处理,因为我只有4个核心可供使用?换句话说,如果所有作业都是相同的,并且每个作业需要T秒,所以它们需要5T秒而不需要多处理,那么他们不应该花2T来处理多处理,给定4个核心来分割工作吗?
但是,我的测试结果大约是5T / 4,多处理。我真的很好奇为什么,下面是我的测试代码:
import multiprocessing
import time
def worker(num):
print ("Worker"+str(num)+" start!")
for i in range(30000000):
abc = 123
print ("Worker"+str(num)+" finished!")
return
if __name__ == '__main__':
jobs = []
start = time.time()
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
jobs.append(p)
p.start()
# p.join()
for job in jobs:
job.join()
end = time.time()
print (end - start)
修改 在阅读@nneonneo的回答后,我想出了这个跟进问题:
如果我的5个作业没有花费相同的时间,但T,T,T,T和2T秒,OS调度程序会尝试确保所有进程获得相等的时间,然后T秒后,我的前4个工作应该完成。然后我的核心中只有一个可以在最后一个工作上工作,因此总时间将是T + T = 2T秒,对吧?总时间不再是6T / 4。
答案 0 :(得分:7)
您创建了五个流程。因此,所有五个同时运行"。您的操作系统的调度程序将根据其调度算法尽职尽责地运行所有五个进程,这通常会尝试确保所有进程获得相同的时间。
因此,五个进程都将获得大约相同的CPU时间,因此它们几乎可以在同一时间完成。
如果你想看到"期待"行为,创建一个包含4名工作人员的multiprocessing.Pool
并向其提交5个工作。 Pool
将只使用四个进程来串行处理传入的作业。