Python多进程池:maxtasksperchild

18

我一直在涉猎Python的多进程库,虽然它提供了非常易于使用的API,但其文档并不总是很清晰。特别是,我发现传递给Pool类实例的"maxtasksperchild"参数非常令人困惑。

以下内容直接来自Python文档(3.7.2):

maxtasksperchild是工作进程可以完成的任务数,在达到此数值之后,该进程将退出并被一个新的进程替换,以便释放未使用的资源。默认值为None,这意味着工作进程将与池一样长寿。

上述内容引起了我的更多问题,而不是回答了我的问题。工作进程如果与池同样长寿会有什么问题?什么使工作进程“新鲜”,何时需要它?通常情况下,何时应明确设置maxtasksperchild的值而不是让它默认为“无限制”,以及考虑到任务数量对chunksize的影响,如何采取最佳做法以最大化处理速度?

@Darkonaut对chunksize的惊人解答中,我现在了解chunksize的作用和代表什么。由于提供chunksize值会影响“任务”的数量,因此我想知道是否有任何应考虑它们之间的依赖关系以确保最大的性能?

谢谢!

1个回答

29

通常情况下,您不需要触碰它。但有时代码调用Python外部的内容可能会导致内存泄漏等问题。因此,在一个工作进程被替换之前限制它执行任务的数量是有帮助的,因为该进程错误地积累的"未使用资源"在进程被丢弃时将被释放。然后启动一个新的"新鲜"进程可以使问题得到控制。由于替换进程需要时间,出于性能考虑,您可以让maxtasksperchild保持默认设置。如果有一天遇到无法解释的资源问题,您可以尝试将maxtasksperchild=1来查看是否有所改变。如果有改变,那么很可能是某些东西正在泄漏。


1
非常感谢您快速而清晰的回答,@Darkonaut!我私下里希望您能看到我的问题并回答它,因为您似乎是关于Python的multiprocessing.pool类方面的主要专家。再次感谢! - Marnix.hoh
2
@Marnix.hoh 不用谢!我相信你说的“专家”一词并不准确,但还是感谢你的反馈 ;) - Darkonaut
1
@Marnix.hoh 当您使用 multiprocessing.Pool任何 池方法时,对象将立即被复制,因此您不会修改父进程中的对象,而是在工作进程中创建新对象。 - Darkonaut
1
@Marnix.hoh 我不太清楚你想要实现什么或者你的需求是什么,所以我不能只指向一个适合你的解决方案。默认情况下,不同的进程不共享它们的内存,因此不能只传递引用,因为每个进程都有自己的虚拟地址空间。如果你的对象很小,并且只有一个进程需要修改同一个对象一次,那么你可以在传递到 pool.map() 中的 iterable 中传递它,让指定的函数调用它的方法并让它返回该对象... - Darkonaut
2
@Marnix.hoh... 会有复制,但在每种情况下都不应该成为问题。如果您需要多个进程修改同一个复杂对象,则使用管理器和代理可能是一种选择,或者您可以查看类似 ray 的东西。 - Darkonaut
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接