这不是一个完整的答案,但来源可以帮助指导我们。当您将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,如下所示:
^{pr2}$
不会改变物理极限,而且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
基本上保存每个任务的结果。虽然保存过多的结果可能会导致内存问题,但如果列表太大,也会导致同样的错误。简言之,源代码并不建议对可能的任务数量进行限制,只要结果在发布后可以放入内存中。在
这能回答问题吗?不完全是。然而,在Ubuntu12.04和Python2.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()
探讨在Python multiprocessing.Pool中使用maxtasksperchild参数的影响,解释其作用于worker创建过程,以及如何潜在地影响内存使用。特别指出,虽然源代码建议根据内存限制来设置,但在实践中,大值可能导致性能问题而非内存溢出。
1960

被折叠的 条评论
为什么被折叠?



