0

我有一个 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 : attribute lookup builtin .instancemethod failed

因为 ROSPy 服务是Environment

是否可以在池本身中创建环境?还是切换到 python 线程有帮助?

4

1 回答 1

1

使用线程您将不会遇到此问题。

另一种方法是启动子进程,其中子进程创建Environment并侦听队列以获取请求并将响应推送到不同的队列。这样环境就存在于子进程中。

于 2018-06-13T00:21:56.103 回答