Python中如何无for循环并行执行类的所有实例方法
问题描述
现有两个Python类:
class Example: def __init__(self): ... def method(self): ...
以及包含Example实例列表的Main类:
class Main: def __init__(self, elements:list): self.elements : list[Example] = elements
已创建实例 main = Main(elements=[example1, example2, example3]),需要在Main类中无需显式for循环,并行执行所有Example实例的method方法。用户尝试以下代码但无法实现:
with multiprocessing.Pool() as p: p.map(main.elements.method()) # 期望效果如同[example1.method(), example2.method(), example3.method()]
已知可借助getattr()遍历执行实例方法,但不知道如何并行化,寻求解决方案。
解决方案
方法1:使用multiprocessing.Pool配合lambda或functools.partial
Pool.map()需要接收一个可调用对象和一个可迭代对象,你可以把每个Example实例作为迭代元素,用lambda函数调用它们的method方法:
import multiprocessing class Main: def __init__(self, elements: list): self.elements: list[Example] = elements def run_parallel(self): with multiprocessing.Pool() as p: results = p.map(lambda obj: obj.method(), self.elements) return results
如果担心lambda在多进程中的序列化问题(部分场景会报错),可以用functools.partial搭配getattr封装:
import multiprocessing from functools import partial def call_method(obj, method_name): return getattr(obj, method_name)() class Main: def __init__(self, elements: list): self.elements: list[Example] = elements def run_parallel(self): with multiprocessing.Pool() as p: func = partial(call_method, method_name="method") results = p.map(func, self.elements) return results
方法2:使用concurrent.futures.ProcessPoolExecutor
这是更现代的并行API,用法更简洁:
from concurrent.futures import ProcessPoolExecutor class Main: def __init__(self, elements: list): self.elements: list[Example] = elements def run_parallel(self): with ProcessPoolExecutor() as executor: results = list(executor.map(lambda obj: obj.method(), self.elements)) return results
原代码无法运行的原因
你写的p.map(main.elements.method())存在两个核心问题:
main.elements是列表对象,本身没有method属性,直接调用会触发属性不存在的错误;map的第一个参数需要是可调用对象,但你这里直接执行了method(),传入的是方法执行后的返回值,而非方法本身。
内容的提问来源于stack exchange,提问作者Nelson Salazar
相关产品推荐
相关产品推荐

