多处理速度与内核数量的关系
Multiprocessing speed up vs number of cores
我的笔记本电脑有 4 个内核,经过一些简单的测试,我发现当我使用 4 个或更多作业的多处理时,我的 CPU 使用率为 100%,3 个作业时约为 75%,大约50% 有 2 个工作,25% 有 1 个工作。这对我来说非常有意义。
然后我发现我的程序在多处理下运行我的作业快了 4 倍,但是 我觉得它不应该总是快 4 倍。
例如,如果我有 运行 5 个作业,我的第 5 个作业是否应该排队并仅在这 4 个作业中的任何一个完成后才被处理,因为我只有 4 个核心可用?换句话说,如果所有作业都是相同的,并且每个作业都需要 T 秒,所以在没有多处理的情况下它们需要 5T 秒,那么在给定 4 个内核来拆分工作的情况下,他们不应该花费 2T 来处理多处理吗?
但是,我的测试结果是多处理时大约 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。
您创建了五个进程。因此,所有五个 运行 "at the same time"。您的 OS 的调度程序将根据其调度算法尽职地 运行 所有五个进程,该算法通常会尝试确保所有进程获得均等的时间份额。
因此,五个进程都将获得大约相同的 CPU 时间,因此它们将在大约相同的时间完成。
如果您想查看 "expected" 行为,请创建一个具有 4 个工人的 multiprocessing.Pool
并向其提交 5 个作业。 Pool
将仅使用四个进程来连续处理传入的作业。
我的笔记本电脑有 4 个内核,经过一些简单的测试,我发现当我使用 4 个或更多作业的多处理时,我的 CPU 使用率为 100%,3 个作业时约为 75%,大约50% 有 2 个工作,25% 有 1 个工作。这对我来说非常有意义。
然后我发现我的程序在多处理下运行我的作业快了 4 倍,但是 我觉得它不应该总是快 4 倍。
例如,如果我有 运行 5 个作业,我的第 5 个作业是否应该排队并仅在这 4 个作业中的任何一个完成后才被处理,因为我只有 4 个核心可用?换句话说,如果所有作业都是相同的,并且每个作业都需要 T 秒,所以在没有多处理的情况下它们需要 5T 秒,那么在给定 4 个内核来拆分工作的情况下,他们不应该花费 2T 来处理多处理吗?
但是,我的测试结果是多处理时大约 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。
您创建了五个进程。因此,所有五个 运行 "at the same time"。您的 OS 的调度程序将根据其调度算法尽职地 运行 所有五个进程,该算法通常会尝试确保所有进程获得均等的时间份额。
因此,五个进程都将获得大约相同的 CPU 时间,因此它们将在大约相同的时间完成。
如果您想查看 "expected" 行为,请创建一个具有 4 个工人的 multiprocessing.Pool
并向其提交 5 个作业。 Pool
将仅使用四个进程来连续处理传入的作业。