Как передать список объектов класса в multiprocessing.process - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть ящик с атомами, около 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: Can't pickle: это не тот же объект, что и cell.Cell»

1 Ответ

0 голосов
/ 02 мая 2019

Спасибо за предложение Майка. Я выясняю проблему. Так как я использую spyder для редактирования скрипта. Каждый раз, чтобы сэкономить время, я не создавал новый проект ячейки вместо того, чтобы использовать сгенерированный. И это может ввести в заблуждение python3 для другого объекта ячейки. Простой способ избежать этой проблемы - перезапустить скрипт или создать новый объект ячейки, чтобы избежать использования сгенерированного старого объекта ячейки в памяти.

...