无法使用 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 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别

LINUX下的mail\mailx为啥无法使用外部SMTP发邮件