Python使用pool.map和列表进行多进程处理

3

我正在使用多进程处理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]

尽管只有4个CPU核心,但这会启动5个独立的进程(25872、8132、1672、27000、20964)。

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

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

  3. 如果列表包含100万个记录,那么在实例化池对象时应该使用什么样的最佳值?

我已经查阅了官方的Python文档,但是没有找到相关信息。请帮忙解答。

1个回答

2
最初的回答:

让我们逐一回答。

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

该池启动了4个进程。 不要将您拥有的核心数与进程数量混淆,它们是完全独立的。 您有5个进程,因为最初的Python进程也被计算在内。 所以,您从 Python进程开始,调用池以启动另外4个 进程,这使总共有5个进程。 如果您发现仅使用了少量进程,则可能意味着它们能够快速地完成任务,因此不需要其他进程。

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

确实可以,您可以实例化任何数量(尽管根据操作系统可能会有某种限制)。但请注意,这只会使您的CPU过载。详情见下文。

  1. 如果一个列表包含一百万条记录,实例化池对象时应该使用什么样的最佳值?

通常,“最佳”的是让池完全使用您的CPU的所有核心。因此,如果您有4个核心4个进程将是最佳选项,尽管有时这并不完全如此,但这是一个很好的起步近似。

最后一点,

我查询了官方Python文档,但找不到相关信息。

这实际上不是特定于Python的,而是计算机科学中的一般行为。


谢谢您的回答。那么,如果值为4,所有CPU核心会被利用吗? - sudhir
当使用值4初始化池对象时,您提到“池启动了4个进程”,但为什么我只看到1个进程ID?它应该在每个核心上启动具有不同进程ID的单独进程。 - sudhir
进程1的ID:26372 进程2的ID:21576 进程3的ID:26112 进程4的ID:18364 进程5的ID:25952 进程6的ID:19344 进程7的ID:6600 进程8的ID:27300 进程9的ID:12652 进程10的ID:25488 当值为20时的输出 - sudhir
@sudhir,请尝试使用4并在调用map时强制使用“chunksize=1”,result = p.map(square, mylist, chunksize=1) - Netwave
让我们在聊天中继续这个讨论 - Netwave
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接