Python 多处理:最大。池工作进程的数量?

Posted

技术标签:

【中文标题】Python 多处理:最大。池工作进程的数量?【英文标题】:Python multiprocessing: max. number of Pool worker processes? 【发布时间】:2014-03-27 20:21:50 【问题描述】:

我正在使用 Python 的多处理器库,想知道我可以调用的最大工作进程是多少?

例如我已经定义了async.pool = Pool(100),它允许我同时运行最多 100 个异步进程,但我不知道真正的最大值是多少?

有人知道如何找到我的游泳池的最大值吗?我猜这取决于 CPU 或内存。

【问题讨论】:

这在很大程度上取决于您的算法和您的机器。唯一知道的方法是进行基准测试。 【参考方案1】:

这不是一个完整的答案,但来源可以帮助指导我们。当您将maxtasksperchild 传递给Pool 时,它会将此值保存为self._maxtasksperchild,并且仅在创建worker 对象时使用它:

def _repopulate_pool(self):
    """Bring the number of pool processes up to the specified number,
    for use after reaping workers which have exited.
    """
    for i in range(self._processes - len(self._pool)):
        w = self.Process(target=worker,
                         args=(self._inqueue, self._outqueue,
                               self._initializer,
                               self._initargs, self._maxtasksperchild)
                        )

        ...

这个工作对象使用maxtasksperchild 像这样:

assert maxtasks is None or (type(maxtasks) == int and maxtasks > 0)

不会改变物理限制,并且

while maxtasks is None or (maxtasks and completed < maxtasks):
    try:
        task = get()
    except (EOFError, IOError):
        debug('worker got EOFError or IOError -- exiting')
        break
    ...
    put((job, i, result))
    completed += 1

基本上保存每个任务的结果。虽然可能通过保存太多结果而遇到内存问题,但首先将列表设置得过大也会导致同样的错误。简而言之,只要结果在发布后可以放入内存,消息来源并没有建议对可能的任务数量进行限制。

这能回答问题吗?不是完全。但是,在带有 Python 2.7.5 的 Ubuntu 12.04 上,此代码 虽然不建议 似乎对于任何较大的 max_task 值都可以正常运行。请注意,对于较大的值,输出似乎需要成倍增长:

import multiprocessing, time
max_tasks = 10**3

def f(x): 
    print x**2
    time.sleep(5)
    return x**2

P = multiprocessing.Pool(max_tasks)
for x in xrange(max_tasks):
    P.apply_async(f,args=(x,))
P.close()
P.join()

【讨论】:

我能想到操作系统强加的很多限制(每个用户的最大进程/线程数、最大进程/总线程数、每个用户的最大内存、每个用户的最大打开文件描述符数进程,打开文件描述符的最大总数等...)和至少一个平台限制(最大物理内存) @isedev 我同意,这就是为什么我添加了一个快速检查以查看我是否会崩溃我的系统(我不能,但我很想知道你是否可以)。我查看了源代码,看看代码中是否有任何硬编码的值(看起来没有)。 您写的是maxtasksperchild,而问题是关于Poolprocesses 参数。【参考方案2】:

你可以使用尽可能多的工人,只要你有记忆。 话虽如此,如果您设置一个没有任何 process 标志的池,您将获得与机器 CPU 相等的工人:

来自Pool 文档:

processes 是要使用的工作进程数。如果 processes 为 None 则使用 os.cpu_count() 返回的数字。

如果您正在进行 CPU 密集型工作,我不希望池中的工作人员数量超过您的 CPU 数量。更多的工作人员会迫使操作系统上下文切换您的进程,从而降低系统性能。根据您的工作,即使使用超线程内核也会阻塞处理器。

另一方面,如果您的任务就像一个网络服务器,其中包含许多并发请求,而这些请求单独并没有使您的处理器达到极限,那么请继续生成尽可能多的工作线程,只要您有内存和/或 IO 容量即可。

maxtasksperchild 是不同的东西。一旦工人被使用/重用了一定次数,这个标志就会强制池释放工人积累的所有资源。

如果您想象您的工作人员从磁盘读取数据,并且这项工作有一些设置开销,那么一旦工作人员完成这么多任务,maxtasksperchild 就会清除该开销。

【讨论】:

以上是关于Python 多处理:最大。池工作进程的数量?的主要内容,如果未能解决你的问题,请参考以下文章

多处理池是不是为每个进程提供相同数量的任务,或者它们是不是被分配为可用?

IIS应用程序池最大进程数设置

线程池,进程和线程的理解

Python:使用多处理池时使用队列写入单个文件

python多处理池,等待进程并重启自定义进程

python中的多处理[破池进程]