我正试图通过使用多处理来并行化我的一个项目的代码。在这个项目中,我有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()
我认为您有两个选项:
-
将池作为变量在类之间传递。进程/线程数量的上限将限制可能影响您的进程切换。
-
使用在主脚本中实例化的池来调用处理密集型方法。好处是您的类不需要包含任何多处理代码。