Многопоточность Многопроцессорная обработка с не сериализуемыми классами - PullRequest
0 голосов
/ 13 июня 2018

У меня есть класс Python, который общается через службу ROS со средой моделирования.Теперь я хочу общаться с несколькими симуляциями параллельно.

Подробно, у класса среды есть функция шага, которая принимает аргумент и возвращает наблюдения моделирования:

self.envs = [Environment("AI1"),
             Environment("AI2")]
self.pool = Pool(processes=len(self.envs))

ac = # some actions 
res0 = self.pool.apply_async(self.envs[0].step, ac[0])
res1 = self.pool.apply_async(self.envs[1].step, ac[1])

res_list = []
res_list.extend(res0.get())
res_list.extend(res1.get())

Конечно, теперь я получаю следующую ошибку

cPickle.PicklingError: Can't pickle: поиск атрибута встроенный .instancemethod не удалось

, поскольку служба ROSPy является членом Environment

Можно ли создать среду в самом пуле?Или поможет переход на потоки Python?

1 Ответ

0 голосов
/ 13 июня 2018

С потоками вы не получите эту проблему.

Альтернативой является запуск подпроцессов, когда подпроцесс создает Environment и прослушивает очередь для запросов и помещает ответы в другую очередь.Таким образом, среда обитает в подпроцессе.

...