无法使用 multiprocessing.Queue 存储代理
Posted
技术标签:
【中文标题】无法使用 multiprocessing.Queue 存储代理【英文标题】:Failing to store agents with multiprocessing.Queue 【发布时间】:2021-09-27 13:27:29 【问题描述】:我尝试通过将模拟拆分为多个进程来并行化它。在每个过程中,我在 T 个周期内模拟 N 个代理。对于一个代理和一个时期来说,这只是
ag.step()
,其中 ag 是代理类的一个实例。我的工人看起来像这样:
class Worker(mp.Process):
def __init__(self, args):
mp.Process.__init__(self, args = args)
self.agents = []
self.N = args[0]
self.T = args[1]
self.q = args[2]
def run(self):
for i in range(N):
ag = agent()
for t in range(T):
ag.step()
self.agents.append(ag)
self.q.put(self.agents)
那我就这么做
q = mp.Queue()
if __name__ == '__main__':
processes, p = [], []
for i in range(mp.cpu_count()):
p = Worker(args = (N,T,q))
p.start()
processes.append(p)
for p in processes:
p.join()
但是,当我尝试让我的模拟代理使用
q.get()
它不起作用,这条线一直运行很长时间。但是如果我存储的不是代理类的实例,而是一些特定的模拟结果,比如做
self.agents.append(ag.state)
相反,它运行良好并且 q.get() 返回一个值列表。为什么会这样?
我现在的 N 和 T 都很小(比如 10 和 10),但是代理类比较复杂(每个代理都有神经网络、记忆等)
【问题讨论】:
【参考方案1】:显然这是因为要放入队列的对象应该是可选择的。在某种程度上,我设法改用 pathos.multiprocessing 来修复它。
【讨论】:
以上是关于无法使用 multiprocessing.Queue 存储代理的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥
Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件
Ubuntu 80端口无法使用-非root用户无法使用1024以下端口