首页 > 解决方案 > 在方法内并行化 for 循环

问题描述

我想并行化fun2()以下代码的 for 循环,但我不知道如何。我想将函数保留在其中class2,这似乎就是映射到multiprocessing.Pool不起作用的原因。但我也无法使其与multiprocessing.pool.ThreadPool.

class class1():
    def __init__(self, x):
        self.var1 = x

    def fun1(self):
        self.result = self.var1**2

class class2():
    def __init__(self, y):
        self.var2 = y

    def fun2(self):
        for v in self.var2:
            obj = class1(v)
            obj.fun1()
            setattr(self, 'obj_{}'.format(v), obj)


obj2 = class2(range(5))
obj2.fun2()

此代码有效,但在我的情况下非常慢,因为fun1在我的实际程序中非常昂贵。很感谢任何形式的帮助。谢谢!

标签: pythonfor-loopmultiprocessing

解决方案


这是一种方法。变化在class2

class class1():
    def __init__(self, x):
        self.var1 = x

    def fun1(self):
        time.sleep(1)              #simulate a long-running job
        self.result = self.var1**2
        print (self.result)

class class2():
    def __init__(self, y):
        self.var2 = y

    def _sub_process(self, v):
        obj = class1(v)
        obj.fun1()
        setattr(self, 'obj_{}'.format(v), obj) 
        print(f"in _subprocess, v is {v}")

    def fun2(self):
        with multiprocessing.Pool() as p:
            print(p.map(self._sub_process, self.var2))        

if __name__ == "__main__":
    obj2 = class2(range(5))
    obj2.fun2()

推荐阅读