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