为什么多处理不会改变类的值?



>我正在尝试对同一类的元素矩阵执行一组操作。所有这些操作都是在我写下的类中定义的,并且可以使用在同一文件的其他类中定义的操作。

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)

相关内容

  • 没有找到相关文章

最新更新