【发布时间】:2018-11-03 19:14:59
【问题描述】:
我最近开始研究多处理模块,发现 pool.map 函数对于快速解析大型数组非常有用。但是有没有办法提前终止池?假设我有一个巨大的列表,我想在列表中找到一个数字,检查它是否可以由 x 设计,如果是则返回 true 并提前终止池的其余部分,我该怎么做呢?为了概念证明,我试图找到从 3 到无穷大的素数(可能是效率最低的方法)。这是一个例子:
import multiprocessing
from functools import partial
finders=multiprocessing.pool(multiprocessing.cpu_count()-1)
def is_devis(x, number):
if number%x==0:
return True
if __name__=="__main__":
Primes=[3, 5, 7, 11, 13, 17, ...]
x=3
while True:
x=x+2
func=partial(is_devis, x)
results=finders.map(func, Primes)
if not (True in results):
Primes.append(x)
我可能无法完全掌握多进程池或 pool.map 函数的工作原理,但据我了解,它会为您平均拆分 iterable,然后将它们分散到池和工作人员将继续工作,直到所有进程返回或完成。有没有办法在一个进程返回值后立即终止池?我已经在 multiprocess.pool 上查看了the documentation,但注意到了
池中的工作进程通常在池的工作队列的整个持续时间内都存在。
提前致谢!
【问题讨论】:
-
使用多处理构建应用程序时,实际应用程序是相关的。如果我以素数为例,我会这样做:给出一个最大数,这将是最后一个要测试的数。创建一个函数,它接受一个数字并告诉你它是否是素数。将此函数映射到最大数量的范围内。因此,结束标准不是“进程返回值”,而是预设的最大数量。如果您需要有关如何构建多处理应用程序的建议,请说明您要实现的目标。
-
@Mathieu 感谢您的意见。除了那个例子之外,我目前没有想到一个特定的项目。实际上,我正在将其作为一个项目进行工作,这只是一种找到尽可能多的素数并观察计算机如何处理它的方法。我还将实现一种将它们全部保存到文件的方法。但不幸的是,问题仍然存在。是否可以根据池中途进程的结果终止池?
-
@noxdafox 是的,这实际上正是我想要的。稍加调整,它就非常适合这项工作。不知道为什么我之前无法在搜索中找到该答案,但谢谢!
标签: python python-3.x multiprocessing pool