【问题标题】:Failing to store agents with multiprocessing.Queue无法使用 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),但是代理类比较复杂(每个代理都有神经网络、记忆等)

【问题讨论】:

    标签: parallel-processing multiprocessing queue


    【解决方案1】:

    显然这是因为要放入队列的对象应该是可选择的。在某种程度上,我设法改用 pathos.multiprocessing 来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多