【发布时间】:2015-12-06 11:38:28
【问题描述】:
我有一个函数,我想并行执行多次,但同时只有定义数量的实例。
这样做的自然方法似乎是使用multiprocessing.Pool。具体来说,文档说
频繁模式 (...) 是允许一个工人在一个 池在退出之前只完成一定数量的工作,被 清理并产生了一个新进程来替换旧进程。这 池的
maxtasksperchild参数将这种能力暴露到最后 用户。
maxtasksperchild 定义为:
maxtasksperchild是工作进程可以执行的任务数 在它退出并被新的工人取代之前完成 进程,以释放未使用的资源。默认 maxtasksperchild 为 None,这意味着工作进程将作为 和游泳池一样长。
我不清楚 task 在这里是什么意思。例如,如果我只想让我的工作人员最多并行运行 4 个实例,我应该将multiprocessing.Pool 启动为
pool = multiprocessing.Pool(processes=4, maxtasksperchild=4)
processes 和 maxtasksperchild 如何协同工作?我可以将processes 设置为 10 并且仍然只有 4 个工作人员在运行(实际上有 6 个进程空闲吗?)
【问题讨论】:
-
当您执行
p.map(f, s)其中p是Pool时,序列s的每个元素都算作一项任务。p.apply(f)算作一项任务。 -
你把
maxtasksperchild的意思全弄错了。但是,为什么您要保留大约 6 个空闲进程?这比只创建 4 个执行实际工作的进程有什么好处? -
@DanD。谢谢 - 一旦完成另一项任务,任何进程(在我的情况下为 4 个)是否会使用这些任务? (他们排队等待处理?)
-
@shx2:你完全理解了 maxtasksperchild 的含义——可能,但这不是很有帮助。至于第二部分 - 我使用 example 来尝试理解两个参数之间的关系,这显然不是真正的 prod 代码。
-
是的,每个进程在完成当前任务后会获得另一项任务(如果有一个任务可用)。 Pool 内部是一个任务队列。
标签: python multithreading python-3.x multiprocessing threadpool