为什么 manager.dict 和 manager.list 很慢,有时会导致死锁?

问题描述

我想在父进程中加载​​一个巨大的 dict/2d 数组并在子进程之间共享它。所有子进程只需要读取它,无需任何其他修改操作。现在我在 multiprocessing.pool 和 manager.(python3.6+linux) 方面有几个问题 (1)使用普通的dict或list有时会导致“cannot allocation memory”错误,是不是linux系统的fork()机制造成的?如果有 30 个进程,那么巨大的 dict 将在内存中复制 30 次,是真的吗? (2)我尝试使用 manager 来处理这个问题,因为它对 dict 和 array 类型更友好。但它非常慢,有时会导致死锁。(足够的内存,但 cpu 使用率为 0)。我该如何解决

#简化版

    def process_pool_return_loaddata(method,data,core_num):
       pool = Pool(processes=core_num)
       pool_result = []
       try:
          pool_result = pool.map(method,data)
       except Exception as e:
          logging.error(e)
       finally:
          pool.close()  
          pool.join()  
       return pool_result
    def func(data):
       list=data[1]
       return([data[0],list+1])
    if __name__ == '__main__':
       list=[[1,2],[3,4],[5,6]] 
       mgr=Manager()
       lst=mgr.list(group_sid)
       set_subject = process_pool_return_loaddata(func,lst,2) 

(3) 在另一个场景中,我想将 manager.dict 对象定义为全局变量,直接在子进程中读取。另外,在父进程后面会发生一些修改。实现与以前类似,但同样,虽然只发生了读取,但速度非常慢。我该如何解决?还有其他一些解决方案吗?感谢您的任何建议!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)