首页 > 解决方案 > 在 python 多处理中更新复杂对象

问题描述

我想计算一个使用互联网的大量 io-bond 任务,然后将结果保存在二维数组中,在单进程模式下需要很多天才能完成。
我通过在每个进程中更新一行来使其成为多处理器。

    class MatrixData:
        def __init__(self, size):
            self.size = size
            self.dist_matrix = [[0.0] * size] * size
            self.last_not_given_row = 0
            self.last_save = 0

            self.resolved_list = mp.Array('b', [False] * size)

        def save_row(self, row_index, data, lock):
            lock.acquire()
            try:
                print('lock')
                self.last_save= self.last_save + 1
                if self.last_save % 2 == 0:
                    self.save_file()
                self.resolved_list[row_index] = True
                for i in range(self.size):
                    self.dist_matrix[row_index][i] = data[i]
            finally:
                print('unlock')
                lock.release()

我使用其他一些参数,例如last_save在短时间内将其保存到文件中。


我使用锁来确保进程安全,但是当我启动一个进程时,它会产生新的空间和损坏的数据。

lock = mp.Lock()
    for i in range(12):
        p = mp.Process(target=worker, args=(data_calculator, MatrixData_obj))
        p.start()
        plist.append(p)

    for p in plist:
        p.join()

标签: pythonparallel-processingmultiprocessinglockingmutex

解决方案


推荐阅读