我正在使用多处理技术来处理python代码。下面是代码
import multiprocessing
import os
def square(n):
#logger.info("Worker process id for {0}: {1}".format(n, os.getpid()))
logger.info("Evaluating square of the number {0}".format(n))
print('process id of {0}: {1}'.format(n,os.getpid()))
return (n * n)
if __name__ == "__main__":
# input list
mylist = [1, 2, 3, 4, 5,6,7,8,9,10]
# creating a pool object
p = multiprocessing.Pool(4)
# map list to target function
result = p.map(square, mylist)
print(result)
服务器中的CPU核心数为4。如果使用4,则仅启动单个进程。通常,它应该启动4个单独的进程,对吧?
如果我在下面的“池”对象中将值设置为8,则是得到的响应
process id of 1: 25872
process id of 2: 8132
process id of 3: 1672
process id of 4: 27000
process id of 6: 25872
process id of 5: 20964
process id of 9: 25872
process id of 8: 1672
process id of 7: 8132
process id of 10: 27000
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
即使只有4个cpu内核,这也开始了5个单独的进程(25872,8132,1672,27000,20964)。
我不明白为什么池在值为4时仅启动1个进程,而在值为8时又启动5个独立进程。
可以使用大于CPU核心数的值实例化池对象吗?
如果列表包含一百万条记录,则在实例化池对象时应该使用的最佳值是什么?
我已经看过官方的python文档,但是找不到信息。 请帮助
答案 0 :(得分:0)
我们一个接一个地回答。
- 我不明白为什么池在值为4时只启动1个进程,而在值为8时又启动5个单独的进程。
该池启动了4个进程。不要将您拥有的核心数量与进程数量完全相同。您有5个进程,因为最初的python也很重要。 因此,您从 main python进程开始,该进程调用池以启动另外4 个进程,使其中的5个成为可能。 如果您看到仅使用了少数几个进程,则意味着它们可能能够足够快地终止任务,因此不需要其他进程。
- 是否可以使用大于CPU核心数量的值实例化池对象?
是的,实际上,您可以实例化任何所需的数字(尽管根据操作系统可能会有某种限制)。但是请注意,这只会使您的CPU过载。下面有更多说明。
- 如果列表包含一百万条记录,则在实例化池对象时应该使用的最佳值是什么?
好吧,通常,“最佳”是您的池充分利用了CPU的所有内核。因此,如果您有 4个内核,则 4个进程将是最佳选择,尽管有时这并不完全是一个很好的起点。
最后一个音符
我已经看过python的官方文档,但是找不到 信息。
这不是真正的python特定的,它是CS中的常规行为。