我正在使用Python的多处理器库,想知道我可以调用的最大工作进程是多少?Python多处理:最大。池工作进程的数量?
E.g.我已经定义了async.pool = Pool(100)
,这将允许我同时运行最多100个异步进程,但是我不知道这个实际最大值是多少?
有谁知道如何找到我的池的最大值?我猜这取决于CPU或内存。
我正在使用Python的多处理器库,想知道我可以调用的最大工作进程是多少?Python多处理:最大。池工作进程的数量?
E.g.我已经定义了async.pool = Pool(100)
,这将允许我同时运行最多100个异步进程,但是我不知道这个实际最大值是多少?
有谁知道如何找到我的池的最大值?我猜这取决于CPU或内存。
这不是一个完整的答案,但来源可以帮助指导我们。当你通过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
本质上保存每个任务的结果。虽然你可能通过保存太多的结果来解决内存问题,但是通过首先将列表过大可以实现同样的错误。简而言之,只要结果一旦释放,结果就可以放入记忆中,资料来源并不建议限制可能的任务数量。
这是回答这个问题吗?不是完全。但是,在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()
,你有记忆,您可以使用尽可能多的工人。 话虽这么说,如果你设置了游泳池,没有任何process
标志,你会得到工人等于机器的CPU:
从Pool
文档:
流程是使用工作进程的数量。如果进程为None,则使用由os.cpu_count()返回的数字。
如果你在做CPU密集型工作,我不希望池中的工作人员比你的CPU数量多。更多的工作人员会迫使操作系统上下文切换你的进程,这反过来会降低系统性能。即使诉诸使用超线程核心,也可能会根据您的工作阻塞处理器。另一方面,如果你的任务像一个拥有许多并发请求的web服务器,而这些并发请求并没有使你的处理器达到最大化,那就继续产生尽可能多的内存和IO容量的工作者。
maxtasksperchild
是不同的。该标志强制池释放工人积累的所有资源,一旦该工人被使用/重复使用了特定次数。
如果您想象您的工作人员从磁盘读取数据,并且此工作有一些设置开销,maxtasksperchild
会在工作人员完成这么多任务后清除开销。
这几乎取决于你的算法和你的机器。唯一知道的方法是基准。 –