模块之间共享的Python多处理池

问题描述 投票:0回答:1

我正在尝试通过使用多处理来并行化我的一个项目的代码。在这个项目中,我有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()
python multiprocessing python-multiprocessing python-module
1个回答
0
投票

我认为您有2个选择:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.