具有不可序列化的多线程多处理 类
Multithreading Multiprocessing with non serialisable classes
我有一个 python class,它通过 ROS 服务与模拟环境进行通信。现在我想与多个模拟并行通信。
详细地说,环境 class 有一个带参数的阶跃函数和 returns 模拟观察:
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 线程会有帮助吗?
使用线程你不会遇到这个问题。
另一种方法是启动子进程,其中子进程创建 Environment
并在队列中侦听请求并将响应推送到不同的队列。这样环境就存在于子进程中。
我有一个 python class,它通过 ROS 服务与模拟环境进行通信。现在我想与多个模拟并行通信。
详细地说,环境 class 有一个带参数的阶跃函数和 returns 模拟观察:
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 线程会有帮助吗?
使用线程你不会遇到这个问题。
另一种方法是启动子进程,其中子进程创建 Environment
并在队列中侦听请求并将响应推送到不同的队列。这样环境就存在于子进程中。