>我正在尝试对同一类的元素矩阵执行一组操作。所有这些操作都是在我写下的类中定义的,并且可以使用在同一文件的其他类中定义的操作。
import multiprocessing as mp
class TestClass():
a=[]
b=[]
c=[]
def run(self,string):
self.a=string
print(self.a)
if __name__=='__main__':
#define the matrix of variables
var=[TestClass]*10
for i in range(10):
var[i]=[TestClass]*10
for k in range(10):
var[i][k]=TestClass()
#do calculations
pool=mp.Pool(processes=3)
pool.starmap_async(TestClass.run, [(var[i][k], 'ciao') for i in range(10) for k in range(10)])
pool.close()
#print results
[print(var[i][k].a) for i in range(10) for k in range(10)]
我希望将所有var[x].a
设置为'ciao'
,但它们都是[]
。
我错过了什么?
据我所知,
multiprocessing
使用pickle
将数据发送到进程,因此进程使用来自主进程的数据副本。它使用返回来发送结果,但它不会将其放回var
。你必须运行进程
result = pool.starmap_async(...)
然后接下来得到结果
result.get()
但它永远不会改变var
中的值。您必须将results
的值复制到var
.
在代码中,我使用矩阵 3x3 来更好地查看结果。 run
使用return self
发回类。
import multiprocessing as mp
class TestClass():
a = []
def run(self, value):
self.a = value
return self # return all class
if __name__=='__main__':
# define the matrix of variables
var = []
for i in range(3):
row = []
for k in range(3):
row.append(TestClass())
var.append(row)
# display matrix to check if IDs are differnt
for row in var:
for item in row:
print(item)
print('-')
print('---')
# define the matrix of variables
#var = [[TestClass() for x in range(3)] for y in range(3)]
#
# display matrix to check if IDs are differnt
#for row in var:
# for item in row:
# print(item)
# print('-')
#print('---')
#run processes
pool = mp.Pool(processes=3)
result = pool.starmap_async(TestClass.run, [(item, 'ciao') for item in row for row in var])
pool.close()
# get results
print('result.get:', result.get())
# display results
for item in result.get():
print('item.a:', item.a)