微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 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 举报,一经查实,本站将立刻删除。