具有非可序列化类的多线程多处理

时间:2018-06-12 23:44:06

标签: python python-2.7 rospy

我有一个python类,它通过ROS服务与模拟环境进行通信。现在我想并行地与多个模拟进行通信。

详细地说,环境类有一个step函数,它接受一个参数并返回模拟观察结果:

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:无法发现:属性查找内置 .instancemethod失败

因为ROSPy服务是Environment

的成员

是否可以在池中创建环境? 或者会切换到python线程帮助吗?

1 个答案:

答案 0 :(得分:1)

通过线程,您无法解决此问题。

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