В ParallelPython метод объекта (object.func ()) не может манипулировать переменной объекта (object.value) - PullRequest
1 голос
/ 30 марта 2012

С помощью Python-Python я пытаюсь преобразовать мой старый последовательный код в параллельный, который сильно зависит от объектов, у которых есть методы, которые изменяют переменные этого объекта.Раздельный пример, в котором я опускаю синтаксис в пользу простоты:

class Network:
    self.adjacency_matrix = [ ... ]
    self.state = [ ... ]
    self.equilibria = [ ... ]

...

   def populate_equilibria(self):
       # this function takes every possible value that self.state can be in
       # runs the boolean dynamical system 
       # and writes an integer within self.equilibria for each self.state
       # doesn't return anything

Я называю этот метод следующим образом: Код:

j1 = jobserver.submit(net2.populate_equilibria,(),(),("numpy as num"))

Задание выполнено, и я знаю, чтопроисходит длительное вычисление, поэтому я предполагаю, что мой код запускается.

Проблема в том, что я новичок в параллельном Python. Я ожидал, что при вызове метода переменная net2.equilibria будет записана соответствующим образом., и я бы получил пересмотренный объект (net2).Вот как работает мой код, независимые объекты с методами, которые воздействуют на переменные объекта.

Скорее, хотя вычисления очевидны и разумно рассчитаны по времени, переменная net2.equilibria остается неизменной.Как будто PP только берет функцию и объект, вычисляет их в другом месте, но никогда не возвращает объект, поэтому я остаюсь со старым.

Что мне не хватает?

Заранее спасибо.

1 Ответ

1 голос
/ 30 марта 2012

ParallelPython не работает таким образом. Когда вы отправляете функцию на сервер заданий, вы получаете дескриптор, который вы можете вызвать, чтобы получить результат вычисления. Это единственный способ получить результат ваших вычислений. Локальные объекты не модифицируются удаленными параллельными процессами.

Что вам нужно сделать, это заключить вызов метода в функцию, которая возвращает новое состояние объекта:

def populate_equilibria (obj):
    obj.populate_equilibria()
    return obj

j1 = jobserver.submit(populate_equilibria,(net2,),(),("numpy as num"))
net2 = j1()
...