我正在使用Python的多处理器库,想知道我可以调用的最大工作进程是什么?
E.g。我已经定义了async.pool = Pool(100)
,它允许我同时运行最多100个异步进程,但我不知道这个实际最大值是什么?
有谁知道如何找到我的游泳池的最大值?我猜这取决于CPU或内存。
答案 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
将在工作人员完成这么多任务后清除该开销。