问题描述
我一直在尝试学习如何使用并发功能在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 (将#修改为@)