python - 模块之间共享的 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()
解决方案
我认为你有两个选择:
将类之间的池作为变量传递。进程/线程数的上限将限制可能影响您的进程切换。
使用在那里实例化的池调用主脚本中的处理密集型方法。好处是您的类不需要包含任何多处理代码。
推荐阅读
- android - 安装我的应用程序时解析包时出错
- algorithm - n维点的凸包中的最大单纯形
- jekyll - 在 Jekyll 中使用静态网页作为主页
- python - pandas 中的 pandas 系列中的多个索引
- postgresql - 数字类型的输入语法无效:“(0.0000000000000000,8)”
- vbscript - 如何通过 VBS 使用 SSO 登录 SAP?
- python - 从 shell 与 cmd 运行 Telegram 的 .lua 脚本
- flutter - Flutter GestureDetector,onTap自动触发,如何?
- html - 过渡不适用于 :before
- regex - 如何编写一个 Scala 正则表达式来捕获两个双引号之间的所有引用内容(包括转义引号)?