Параллельное манипулирование объектом с питоном - PullRequest
0 голосов
/ 22 января 2019

У меня есть список объектов ObjList, где все объекты являются экземплярами одного и того же класса.Этот класс имеет метод run, который я хотел бы выполнить параллельно для объектов в ObjList.

Результаты вычислений затем сохраняются внутри объектов.Без распараллеливания в настоящее время я делаю что-то вроде

for obj in self.ObjList:
    obj.Run()

. Этот код является частью метода класса, который содержит и обрабатывает «списки» этих объектов.После этого я хочу прочитать результаты вычислений, выполненных obj.Run.Я попробовал методы multiprocessing.Pool, где столкнулся с проблемами с pickle.Я также пытался использовать multiprocessing.Process, но там у меня была проблема, что результаты были сохранены в копии объекта, который затем был отброшен.Мне не удалось вернуть манипулируемый объект.

Существует ли простой способ применения одного и того же метода класса к списку объектов, которые являются экземплярами одного и того же класса (который довольно сложный и использует несколько объектов сам)?

Редактировать : Я попробовал подход, предложенный в ответах на этот вопрос , но тогда я всегда получаю ошибки вида

AttributeError: Can't pickle local object 'someclass.<locals>.<lambda>'

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Я предложу сначала использовать этот фрагмент кода.

def thread_run(obj):
    obj.Run()

def Dothejob():
    tr = []
    for cmd in obj:
        t = threading.Thread(target=thread_run, args=(obj))
        t.start()
        tr.append(t) 
    # waiting for all threads ended
    for item in tr:
        item.join()

Dothejob()
0 голосов
/ 22 января 2019

Я не уверен, что то, что я предложу, - это "простой способ", но посмотрите, сработает ли это для вас.

Я бы рекомендовал использовать сторонний компонент (например, numba ), чтобы преобразовать ваш код в скомпилированный машинный код, который «точно в срок», когда это необходимо для используйте возможности параллельной архитектуры, например графических процессоров NVIDIA или собственного многоядерного процессора. Таким образом, вам не нужно справляться со сложностями параллельной оптимизации.

Поскольку каждый код / ​​приложение имеет свою собственную логику и поток, я не могу указать точное преобразование вашего кода, но, на мой взгляд, это хорошая строка, которая (надеюсь) не требует много изменения в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...