【问题标题】:Python multiprocessing using pool.map with list使用带有列表的 pool.map 进行 Python 多处理
【发布时间】:2019-05-30 08:28:36
【问题描述】:

我正在使用多处理处理 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. 我不明白为什么池在值为 4 时只启动了 1 个进程,而在值为 8 时启动了 5 个单独的进程。

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

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

我浏览过官方 python 文档,但找不到信息。 请帮忙

【问题讨论】:

    标签: python multiprocessing pool


    【解决方案1】:

    我们一一回答。

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

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

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

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

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

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

    最后一点,

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

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

    【讨论】:

    • 感谢您的回复。那么如果值为 4,是否会使用所有 cpu 内核?
    • @sudhir,这取决于操作系统,但应该如此。
    • 当池对象以值 4 启动时,您提到“池启动了 4 个进程”,但为什么我只看到 1 个进程 ID?它应该在每个核心权利上使用不同的进程 ID 启动单独的进程
    • @sudhir,是的,它应该启动 4 个新进程
    • 进程 id 为 1:26648 进程 id 为 2:26648 进程 id 为 3:26648 进程 id 为 4:26648 进程 id 为 5:26648 进程 id 为 6:26648 进程 id 为 7:26648进程 ID 为 8:26648 进程 ID 为 9:26648 进程 ID 为 10:26648
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2015-01-12
    • 2019-01-30
    • 2011-07-23
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多