Многопоточность Многопроцессорная обработка с не сериализуемыми классами

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

Другие вопросы по тегам