首页 > 解决方案 > 模块之间共享的 Python 多处理池

问题描述

我正在尝试通过使用多处理来并行化我的一个项目的代码。在这个项目中,我有 3 个模块:A、B 和 C,每个模块都包含一个与模块名称相同的类。模块 A 中的类实例化模块 B 和 C 中的对象,然后由另一个文件中的脚本实例化,该文件在其中运行函数。

现在,这些类(A、B 和 C)中的每一个都有一个运行一些数组操作的方法,我会让它并行运行。到目前为止,我的方法是在方法内实例化一个池,让它运行它需要运行的代码,然后在完成后终止池。问题是这些方法被多次调用,因此每次创建和销毁池都会使代码随着时间的推移变得越来越慢。

有没有办法让模块之间共享一个全局池,以便他们在需要时调用它,而不必每次都创建和销毁它?

# A.py
import B, C

class A(){
  def __init__(self):
    b = B()
    c = C()

  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]

  def main(self):
    b.method()
    c.method()
    self.method()
# B.py
class B(){
  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]
}
# C.py
class C(){
  def method(self):
    pool = mp.Pool()
    results = [pool.apply_async(self.parfunc, args=(i, )) for i in array]
    output = [p.get() for p in results]
}
# script.py
import A
if __name__ = '__main__':
  a = A()
  a.main()

标签: pythonmultiprocessingpython-multiprocessingpython-module

解决方案


我认为你有两个选择:

  1. 将类之间的池作为变量传递。进程/线程数的上限将限制可能影响您的进程切换。

  2. 使用在那里实例化的池调用主脚本中的处理密集型方法。好处是您的类不需要包含任何多处理代码。


推荐阅读