如何在python中并行化子类中的进程

如何在python中并行化子类中的进程,python,python-multithreading,multiprocess,Python,Python Multithreading,Multiprocess,我正在做一个项目,我有一个主要功能,一个叫做模拟器的类和一个叫做车辆的类。在主函数中,我调用:simulator.run(),它为simulator.vehicle\u list[]中的所有车辆调用vehicle.run() 车辆必须计算轨迹,这是一个耗时的过程。这些进程相互独立,我希望vehicle.run()计算在多个CPU核上运行 作为初学者,我创建了一个简单的项目(与上面不同,具有不同的类名,但我希望足够直观),但我无法让它工作。 我的代码没有在子类中调用self.calculate()

我正在做一个项目,我有一个主要功能,一个叫做
模拟器
的类和一个叫做
车辆
的类。在主函数中,我调用:
simulator.run()
,它为
simulator.vehicle\u list[]中的所有车辆调用
vehicle.run()

车辆必须计算轨迹,这是一个耗时的过程。这些进程相互独立,我希望
vehicle.run()
计算在多个CPU核上运行

作为初学者,我创建了一个简单的项目(与上面不同,具有不同的类名,但我希望足够直观),但我无法让它工作。 我的代码没有在子类中调用self.calculate()
。当我从master类中删除
if uuuuuu name_uuuu=='\uuuuuuuu main\uuuuuuu':
语句时,我得到了错误:

'multi_subclass' object has no attribute '_closed'
我有三个python文件:

multi_main.py

from multi_class import multi_class

main_class = multi_class()
main_class.calculate()

#main_class.calculate2()
multi_class.py

from multi_subclass import multi_subclass

class multi_class():
    def __init__(self):
        print("I am multi_class")
        subclass_list = []
        for i in range(10):
            subclass_list += [multi_subclass()]
        self.subclass_list = subclass_list
        
    def calculate(self):
        if __name__ == '__main__':
            processes = []
            for i in range(10):
                processes.append(self.subclass_list[i])
                self.subclass_list[i].start()
                
            [proc.join() for proc in processes]
multi_subclass.py

from multiprocessing import Process

class multi_subclass(Process):
    def __init__(self):
        print("I am multi_subclass")
        
    def calculate(self):
        print("Running massive calculations")
        self.member_variable = "Finished with calculation"
        
    def calculate2(self):
        print("I also want to be paralellized but NOT together with calculate!")
        
    def run(self):
        self.calculate()

好的,这条语句
如果uuuu name uuuu=='\uuuuu main uuuu':
已经就位,这样如果主进程生成新进程,那么这些新进程也不会生成新进程

所以,你的切入点应该有这个

multi_main.py

from multi_class import multi_class
from timeit import default_timer


start = default_timer()

if __name__ == '__main__':

    main_class = multi_class()
    main_class.calculate()
    print(f"Your code ran in {default_timer() - start} seconds instead of 10 seconds because of multiprocessing.LOL")
multi_class.py
过程(target=abc)
abc是一个函数

from multi_subclass import multi_subclass

class multi_class():
    def __init__(self):
        print("I am multi_class")
        subclass_list = []
        for i in range(10):
            subclass_list += [multi_subclass()]
        self.subclass_list = subclass_list

    def calculate(self):
        processes = []

        for i in range(10):
            # you were putting a different process in the list and never starting it but you were waiting for it to complete using `.join()` and starting a different process but never waiting for it to complete
            # fixed code below
            # processes.append(self.subclass_list[i])
            # self.subclass_list[i].start() 
            

            # create a process, put it in the list, start it
            process = self.subclass_list[i]
            processes.append(process)
            process.start()

        # wait for it to complete here
        [proc.join() for proc in processes]
但是在您的代码中,
\uuuu init\uuu
不调用Process类的
\uuuu init\uuu
,返回的对象是一个没有目标的简单对象。 我已经添加了代码

from multiprocessing import Process
import time
class multi_subclass(Process):
    def __init__(self):
        print("I am multi_subclass")
        super().__init__(target=self.calculate)

    def calculate(self):
        print("Running massive calculations")
        time.sleep(1)
        self.member_variable = "Finished with calculation"


    def calculate2(self):
        print("I also want to be paralellized but NOT together with calculate!")

    def run(self):
        self.calculate()
输出

I am multi_class
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
I am multi_subclass
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Running massive calculations
Your code ran in 1.0859881550000001 seconds instead of 10 seconds because of multiprocessing.LOL

谢谢你,高丽,这正是我想要的!:)@杰克:很高兴我能帮忙。我最近学习了线程和多处理模块,这对我测试我的知识来说是一个很好的测试:P..谢谢