Многопоточность Многопроцессорная обработка с не сериализуемыми классами
У меня есть класс 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 ответ
С темами вы не получите эту проблему.
Альтернативой является запуск подпроцессов, когда подпроцесс создает Environment
и прослушивает очередь запросов и помещает ответы в другую очередь. Таким образом, среда живет в подпроцессе.