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