Python 多处理使用 pool.map with list



我正在使用多处理处理处理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 个单独的进程,对吗?

如果我在下面的 Pool 对象中将值设置为 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]

这启动了 5 个单独的进程(25872,8132,1672,27000,20964),即使只有 4 个 CPU 内核。

  1. 我不明白为什么池在值为 1 时只启动了 4 个进程,而在值为 5 时启动了 8 个单独的进程。

  2. 是否可以使用大于 CPU 内核数的值实例化池对象?

  3. 另外,如果列表包含一百万条记录,我们在实例化池对象时应该使用的最佳值是什么?

我已经浏览了官方的python文档,但我找不到信息。 请帮忙

让我们一一回答。

  1. 我不明白为什么池在值为 1 时只启动了 4 个进程,而在值为 5 时启动了 8 个单独的进程。

池启动了 4 个进程。不要将您拥有的内核数量误认为进程数量,是完全独立的。您有 5 个进程,因为最初的 python 进程也很重要。 因此,您从主要的python 进程开始,这些进程调用池来启动另外 4个进程,即其中的 5 个进程。 如果您看到只有少数进程被使用,这意味着它们可能能够足够快地终止任务,因此不需要其他进程。

  1. 是否可以使用大于 CPU 内核数的值实例化池对象?

是的,确实,您可以实例化您想要的任何数字(尽管根据操作系统可能会有某种限制)。但请注意,这只会使您的 CPU 过载。更多解释如下。

  1. 如果列表包含一百万条记录,我们在实例化池对象时应该使用的最佳值应该是多少?

好吧,通常"最佳"是 CPU 的所有内核都被池完全使用。因此,如果您有 4 个内核,则4 个进程将是最佳选择,尽管有时这并不完全像它是一个很好的起始近似值。

最后一点,

我已经浏览了官方的python文档,但我找不到 信息。

这不是真正的python特定的,它是CS中的一般行为。

相关内容

  • 没有找到相关文章

最新更新