【问题标题】:Python multiprocessing pool: maxtasksperchildPython 多处理池:maxtasksperchild
【发布时间】:2019-03-03 23:23:58
【问题描述】:

我一直在涉足 Python 的多处理库,尽管它提供了非常易于使用的 API,但它的文档并不总是很清楚。特别是,传递给 Pool 类实例的参数“maxtasksperchild”让我感到非常困惑。

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

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

以上对我提出的问题比它回答的要多。工作进程与池一样长是不是很糟糕?是什么让工作进程“新鲜”?什么时候需要?一般来说,什么时候应该明确设置 maxtasksperchild 的值,而不是让它默认为“无”,为了最大限度地提高处理速度,什么是最佳实践?

来自@Darkonaut's amazing answer on chunksize 我现在明白了 chunksize 的作用和代表的意义。由于为 chunksize 提供值会影响“任务”的数量,我想知道是否应该考虑它们的依赖性以确保最大性能?

谢谢!

【问题讨论】:

    标签: python multiprocessing python-multiprocessing pool


    【解决方案1】:

    通常您不需要触摸它。例如,有时可能会出现在 Python 外部调用代码泄漏内存的问题。限制工作进程在被替换之前执行的任务数量会有所帮助,因为当进程被废弃时,他错误地积累的“未使用资源”会被释放。开始一个新的、“新鲜的”过程,然后保持问题得到控制。因为替换进程需要时间,所以为了提高性能,您默认使用maxtasksperchild。当你有一天遇到无法解释的资源问题时,你可以尝试设置maxtasksperchild=1 看看这是否会改变一些东西。如果是这样,则可能 something 正在泄漏 something

    【讨论】:

    • 非常感谢您快速而明确的回答@Darkonaut!我暗暗希望你能看到我的问题并回答它,因为你似乎是这里关于 python 的 multiprocessing.pool 类的主要专家。再次感谢!
    • @Marnix.hoh 不客气!很确定您关于“专家”的说法不正确,但感谢您的反馈;)
    • @Marnix.hoh 我不太清楚您想要实现什么或您的需求是什么,所以我不能只为您指出一种适合您的解决方案。默认情况下,不同的进程不共享它们的内存,因此不能只传递引用,因为每个进程都有自己的虚拟地址空间。如果您的对象很小并且只有一个进程需要修改一个相同的对象一次,您可以将它传递给您传递给pool.map()iterable,让指定的函数在其上调用您的方法并让它返回对象...
    • @Marnix.hoh... 会有复制,但在每种情况下都不是问题。如果您需要多个进程修改同一个复杂对象,则可以选择使用管理器和代理,或者您可以查看 ray 之类的东西。
    • @Marnix.hoh 真的无法建议您可以轻松实现的其他东西。如果您的操作系统确实支持分叉(不是 Windows),您可以让您的工作进程将您的对象作为全局对象继承,这样它们就不必通过队列发送。但这对于使用 Pool (通过initializer-parameter 和一些协调......)实现将是不平凡且丑陋的。使用 multiprocessing.Processmultiprocessing.Queue 更容易返回值 (example)。
    猜你喜欢
    • 1970-01-01
    • 2021-07-24
    • 2020-08-14
    • 2016-11-10
    • 2017-04-18
    • 1970-01-01
    • 2014-08-25
    • 2016-12-07
    • 2020-03-12
    相关资源
    最近更新 更多