Python并行处理-从对象的属性获取结果

问题描述

我一直在尝试学习如何使用并发功能在Python中使用并行处理,并且一直在尝试实现一个简单的示例。在这种情况下,我有一个名为Multiply的类,该类由三个数字(第一个数字,第二个数字和秒)创建,并将它们保存为对象的属性。然后,我运行.multiply()方法将这两个数字相乘并将结果保存为名为.result的属性(因此,我不会将结果作为.multiply方法的一部分返回),而只是将其分配给该属性)。它有一个time.sleep来减慢它的速度,所以我可以看到多处理正在工作。这在以下文件中,我将其称为Multiply.py)

"x","y"
5.05,-0.943548668635907
5.05,-0.943548668635907
4.26,-0.899405409685178

要运行代码,我创建了以下文件(Run_Multiply.py)。我已经创建了一个Multiply对象列表(在obj_list []中),并且试图并行运行计算。当我运行多进程代码时,它似乎是并行运行的,可以正确地计算结果并使用对属性调用来打印结果,如乘法方法中的print(self.result)所示。但是,当我稍后尝试访问results属性时(在run_multiprocess()的第二个for循环中),它仅返回一个None列表并且似乎没有正确保存该属性。似乎executor.submit正在运行代码并进行计算,但似乎没有将结果保存为对象的属性

import time

class Multiply:

    @property
    def number_1(self):
        return self._number_1

    @number_1.setter
    def number_1(self,value):
            self._number_1 = value

    @property
    def number_2(self):
        return self._number_2

    @number_2.setter
    def number_2(self,value):
            self._number_2 = value

    @property
    def seconds(self):
        return self._seconds

    @seconds.setter
    def seconds(self,value):
        self._seconds = value

    @property
    def result(self):
        return self._result

    def __init__(self,first_value,second_value,seconds):
        self.number_1 = first_value
        self.number_2 = second_value
        self.seconds = seconds
        self._result = 0

    def multiply(self):
        time.sleep(self.seconds)
        self._result = self.number_1*self.number_2
        print(self.result)

当我执行print(result_list)时,我得到一个零列表(result的认值)。有谁知道为什么会这样并且result属性仍然为0?我希望能够传递一个Multiply对象的列表,在这些对象上运行乘法方法,并将结果保存为这些乘法对象的属性,以备后用,但我无法使其正常工作。 print(result_list)的输出如下所示:

from Multiply import Multiply
import concurrent.futures
import time

list_1 = [1,2,3,4,5,6,7,8]
list_2 = [1,8]
seconds = [8,1]
obj_list = []
for i in range(0,len(list_1)):
    multiply_obj = Multiply(list_1[i],list_2[i],seconds[i])
    obj_list.append(multiply_obj)

expected = [1,9,16,25,36,49,64]  

def run_multiprocess():
    start = time.perf_counter()
    with concurrent.futures.ProcesspoolExecutor() as executor:
        results = []
        for obj in obj_list:
            futures = executor.submit(obj.multiply)
            results.append(futures)

    finish = time.perf_counter()

    print('Finish in {0} second(s)'.format(round(finish - start,1)))

    result_list = []
    for obj in obj_list:
        result_list.append(obj.result)
    print(result_list)


if __name__ == '__main__':
    run_multiprocess()

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)