2014-02-25 56 views
2

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

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

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

+1

这几乎取决于你的算法和你的机器。唯一知道的方法是基准。 –

回答

2

这不是一个完整的答案,但来源可以帮助指导我们。当你通过maxtasksperchildPool它保存这个值作为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 

本质上保存每个任务的结果。虽然你可能通过保存太多的结果来解决内存问题,但是通过首先将列表过大可以实现同样的错误。简而言之,只要结果一旦释放,结果就可以放入记忆中,资料来源并不建议限制可能的任务数量。

这是回答这个问题吗?不是完全。但是,在Ubuntu 12.04上使用Python 2.7.5,这个代码而不适合的对于任何大的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() 
+0

我可以考虑操作系统施加的大量限制(每个用户最大进程数/线程数,最大进程数/整个thred,每个用户最大内存,每个进程打开文件描述符的最大数量,最大打开总数文件描述符等)和至少一个平台限制(最大物理内存) – isedev

+0

@isedev我同意,这就是为什么我添加了一个快速检查,看看我是否可以崩溃我的系统(我不能,虽然我有兴趣知道你是否可以)。我查看了源代码,看看代码中是否有硬编码的值(这看起来没有)。 – Hooked

+0

你写关于'maxtasksperchild'的问题是关于'进程'参数到'Pool'的问题。 –

0

,你有记忆,您可以使用尽可能多的工人。 话虽这么说,如果你设置了游泳池,没有任何process标志,你会得到工人等于机器的CPU:

Pool文档:

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

如果你在做CPU密集型工作,我不希望池中的工作人员比你的CPU数量多。更多的工作人员会迫使操作系统上下文切换你的进程,这反过来会降低系统性能。即使诉诸使用超线程核心,也可能会根据您的工作阻塞处理器。另一方面,如果你的任务像一个拥有许多并发请求的web服务器,而这些并发请求并没有使你的处理器达到最大化,那就继续产生尽可能多的内存和IO容量的工作者。

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

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