如何将类对象列表传递到multiprocessing.process

时间:2019-04-29 16:11:07

标签: python-3.x multiprocess

我有一盒原子,大约200k,我想计算原子之间的距离。不使用并行方法进行此计算就花费了很长时间。所以我想用pool.map来帮助我。我首先将盒子切成几个小单元,并定义了一个单元对象,其中包含该单元中的所有原子信息。但是,当我无法将单元格对象列表传递给进程时。我是这项多处理任务的初学者,任何人都可以对如何解决这个问题有所了解吗?这是我的脚本的简化:

class atoms():
    def __init__(self):
        self.__idx__ = 0 # Has other function to change this idx and coord
        self.__coord__ = [x, y, z] 
    def getIdx(self):
        return self.__idx__

class cell():
    def __init__(self):
        self.__idx__ = 0
        self.__atoms__ = [atom1, ...,]
    def outInfo(self):
        for a in self.__atoms__:
            print(a.getIdx())

from multiprocessing import Process, Value, Array

def f(cell_lists):
    for c in cell_lists:
        print(c.outInfo())

if __name__ == '__main__':
    cell_lists = [cell1, cell2, ..., cell8]
    p = Process(target=f, args=(cell_lists ))
    p.start()
    p.join()

错误消息是“ PicklingError:无法腌制:它与cell.Cell不是同一对象”

1 个答案:

答案 0 :(得分:0)

感谢迈克的建议。我找出问题所在。由于我正在使用spyder编辑脚本。每次为了节省时间,我没有创建一个新的单元项目,而是使用生成的项目。并且这可能将python3误导到另一个单元对象。避免此问题的简单方法是重新启动脚本或创建新的单元格对象,以避免在内存中使用生成的旧单元格对象。