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

时间:2014-02-25 14:28:09

标签: python multiprocessing pool

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

E.g。我已经定义了async.pool = Pool(100),它允许我同时运行最多100个异步进程,但我不知道这个实际最大值是什么?

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

2 个答案:

答案 0 :(得分:3)

这不是一个完整的答案,但来源可以帮助指导我们。当您将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)
                        )

        ...

此worker对象使用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()

答案 1 :(得分:1)

您可以使用尽可能多的工作人员。 话虽这么说,如果你设置一个没有任何process标志的池,你将让工人等于机器CPU:

来自Pool文档:

  

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

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

另一方面,如果您的任务就像是一个网络服务器,其中包含许多并发请求,而这些请求并没有最大化您的处理器,请继续生成尽可能多的工作人员,因为您已拥有内存和/或IO容量。

maxtasksperchild有所不同。一旦工作人员被使用/重复使用了一定次数,此标志会强制池释放工作人员积累的所有资源。

如果您想象您的工作人员从磁盘读取,并且此工作有一些设置开销,maxtasksperchild将在工作人员完成这么多任务后清除该开销。