限制多处理中使用的处理器数量
Restrict the number of processors used in multiprocessing
对于我的代码,我需要使用 Python 中的 multiprocessing
模块来实现代码中的并行性。我为此编写了以下代码:
for j in range(0, len(filters)):
p = multiprocessing.Process(target=task, args=(filters[j],j+1,img,i+1,fname))
p.start()
processes.append(p)
for j in range(0, len(filters)):
p.join()
以上代码工作正常,但它使用了系统中所有可用的处理器。
例如:如果我有 16 个处理器,它会使用系统中的所有 16 个处理器。
有什么方法可以 control/limit MultiProcessing 模块使用的处理器数量?
您应该使用 multiprocessing.Pool - 它会为您提供一定大小的池。
processes = []
with Pool(processes=4) as pool:
for j in range(0, len(filters)):
p = pool.apply_async(target=task, args=(filters[j],j+1,img,i+1,fname))
processes.add(p)
for result in processes:
print('\t', result.get())
完整的文档是 here。
这有一个额外的好处,即您不会为每个任务启动一个新流程,而是重复使用相同的流程。考虑到启动进程的成本很高,您将获得更好的性能。
要猜测的进程数并非微不足道 - 这取决于您的工作是否受到 CPU 限制,I/O 限制以及其他程序对您的 PC 造成的负载。
如果你是 CPU 绑定的,你可以获得这样的核心数:
multiprocessing.cpu_count()
您应该选择一个小于该值的值,例如-2 留下 space 做其他工作,但这只是猜测。
对于我的代码,我需要使用 Python 中的 multiprocessing
模块来实现代码中的并行性。我为此编写了以下代码:
for j in range(0, len(filters)):
p = multiprocessing.Process(target=task, args=(filters[j],j+1,img,i+1,fname))
p.start()
processes.append(p)
for j in range(0, len(filters)):
p.join()
以上代码工作正常,但它使用了系统中所有可用的处理器。
例如:如果我有 16 个处理器,它会使用系统中的所有 16 个处理器。
有什么方法可以 control/limit MultiProcessing 模块使用的处理器数量?
您应该使用 multiprocessing.Pool - 它会为您提供一定大小的池。
processes = []
with Pool(processes=4) as pool:
for j in range(0, len(filters)):
p = pool.apply_async(target=task, args=(filters[j],j+1,img,i+1,fname))
processes.add(p)
for result in processes:
print('\t', result.get())
完整的文档是 here。
这有一个额外的好处,即您不会为每个任务启动一个新流程,而是重复使用相同的流程。考虑到启动进程的成本很高,您将获得更好的性能。
要猜测的进程数并非微不足道 - 这取决于您的工作是否受到 CPU 限制,I/O 限制以及其他程序对您的 PC 造成的负载。 如果你是 CPU 绑定的,你可以获得这样的核心数:
multiprocessing.cpu_count()
您应该选择一个小于该值的值,例如-2 留下 space 做其他工作,但这只是猜测。