python - 使用带有列表的 pool.map 进行 Python 多处理
问题描述
我正在使用多处理处理 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 内核。
我不明白为什么当值为 4 时池只启动了 1 个进程,而当值为 8 时启动了 5 个单独的进程。
可以使用大于 CPU 核心数的值来实例化池对象吗?
如果一个列表包含一百万条记录,那么在实例化池对象时我们应该使用的最佳值应该是多少?
我已经通过官方的python文档,但我找不到信息。请帮忙
解决方案
让我们一一解答。
- 我不明白为什么当值为 4 时池只启动了 1 个进程,而当值为 8 时启动了 5 个单独的进程。
池启动了 4 个进程。不要将您拥有的核心数误认为进程数,这是完全独立的。您有 5 个进程,因为最初的 python 进程也很重要。因此,您从主要的python 进程开始,它们调用池来启动另外 4个,这使得其中有 5 个。如果您看到只有少数进程正在使用,这意味着它们可能能够足够快地终止任务,因此不需要其他进程。
- 可以使用大于 CPU 核心数的值来实例化池对象吗?
是的,您可以实例化任何您想要的数字(尽管可能存在某种限制,具体取决于操作系统)。但请注意,这只会使您的 CPU 过载。下面有更多解释。
- 如果一个列表包含一百万条记录,那么在实例化池对象时我们应该使用的最佳值应该是多少?
好吧,通常“最佳”是您的 CPU 的所有内核都完全由您的池使用。所以,如果你有4 个核心,4 个进程将是最好的选择,尽管有时这并不完全一样,它是一个很好的开始近似值。
最后一点,
我已经通过官方的python文档,但我找不到信息。
这并不是真正的 python 特定的,它是 CS 中的一般行为。
推荐阅读
- python-3.x - Moviepy.editor 导入错误“ImportError:无法导入名称‘系统’”
- javascript - 如何将用户输入的日期字符串转换为 JavaScript 日期格式
- angular - ng2-daterangepicker - endDate 在自定义日期范围选项中选择 startDate 时总是重置
- python - 具有最近日期的 Python 过滤器列表
- regex - 检查苹果脚本中是否包含四位数字年份
- python - 在 python 控制台中使用右移(空格)打印 pandas 数据帧
- html - 多个幻灯片的奇怪结果
- perl - Perl Dancer2 默认路由失败
- python - Python SQL Select 从字符串列中删除前导 0
- apache-spark - pyspark:使用自定义时间序列数据的滚动平均值