Python multiprocessing无法正常创建嵌套字典结构问题咨询
问题原因
multiprocessing.Manager()创建的托管字典manager.dict(),仅能自动同步第一层键值的修改操作。你给第一层赋值dic[user] = {}的时候,这个空字典是普通Python字典,不属于托管对象,后续你修改这个普通嵌套字典dic[user][i] = xxx的时候,托管字典感知不到内部的修改,自然不会同步到主进程,所以主进程看到的永远是最开始赋值的空字典。
解决方案
方案1:嵌套层也使用托管字典
把内层的子字典也换成manager.dict()创建的托管对象即可,修改后代码如下:
import multiprocessing import random users = [1, 2, 3, 4, 5, 6, 7, 8, 9, 100] users2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 100] def random_number_check(user, dic, list2, manager): # 内层也用manager创建托管字典 dic[user] = manager.dict() print(list2) for i in list2: dic[user][i] = random.randint(0, 1000) print(dic[user][i]) if __name__ == '__main__': manager = multiprocessing.Manager() return_dict = manager.dict() jobs = [] for i in range(10): p = multiprocessing.Process(target=random_number_check, args=(users[i], return_dict, users2, manager)) jobs.append(p) p.start() for proc in jobs: proc.join() # 最后转成普通字典方便查看 print({k: dict(v) for k, v in return_dict.items()})
方案2:修改后主动触发同步
如果不想用嵌套托管字典,也可以先在子进程本地把整个子字典构造完成,再一次性赋值给第一层的key,这样托管字典能感知到第一层的赋值操作,自动同步:
import multiprocessing import random users = [1, 2, 3, 4, 5, 6, 7, 8, 9, 100] users2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 100] def random_number_check(user, dic, list2): # 先在本地构造完整的子字典 sub_dic = {} print(list2) for i in list2: sub_dic[i] = random.randint(0, 1000) print(sub_dic[i]) # 一次性赋值给第一层key,触发同步 dic[user] = sub_dic if __name__ == '__main__': manager = multiprocessing.Manager() return_dict = manager.dict() jobs = [] for i in range(10): p = multiprocessing.Process(target=random_number_check, args=(users[i], return_dict, users2)) jobs.append(p) p.start() for proc in jobs: proc.join() print(return_dict)
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

