【问题标题】:How to terminate a python multiprocess pool early [duplicate]如何提前终止python多进程池[重复]
【发布时间】: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


【解决方案1】:

一种天真的方法是设置一个全局标志,线程在找到答案时可以设置该标志。在其他每个线程中,您可以定期检查标志,如果设置了则让线程终止。

【讨论】:

  • 请注意,这需要单独的进程 share 标志,这意味着将其放入 Manager 对象或使用共享内存原语。
  • 我在想类似的事情。不幸的是,根据我的理解,当创建一个新进程时,当创建一个新进程时,它正在创建一个全新的 python 实例,它不共享任何全局变量。正如@torek 所提到的,您可以使用特定类型的共享内存变量来解决这个问题。我尝试过使用这种方法,但是因为 pool().map 只接受一个可迭代对象,所以使用部分函数会引发错误。 "RuntimeError: 同步对象只能通过继承在进程之间共享"
  • @BobserLuck:Linux multiprocess 使用 fork() 以便子级继承(复制)父级设置,包括 Manager 对象。管理器对象检测分叉并连接到通信通道以共享更新。共享内存原语在内部更简单,因此更高效,但更难使用。我认为管理器可以在 Windows 上使用,但我不确定细节。
猜你喜欢
  • 2018-10-11
  • 2013-04-30
  • 2014-08-04
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2018-11-05
相关资源
最近更新 更多