多处理无法创建字典结构

multiprocessing cannot create dictionary structure

问题非常类似于:Adding values in dictionary multiprocessing

我想用multiprocessing写字典更快,但是不知为何,multiprocessing函数只能写字典的第一层。这意味着,当使用上面的例子时,字典工作得很好。

但不是以随机数作为值的原始输出:

{1: 169, 2: 520, 3: 637, 4: 559, 5: 497, 6: 470, 7: 113, 8: 221, 9: 946, 100: 69}

我想要在这些词典中创建词典的功能。但是,我得到的输出是一个空字典,就好像子字典创建 dic[user][i] = random.randint(0, 1000) 没有发生一样,结果,我在下一行 print(dic[user][i]).

中得到一个键错误

{3: {}, 1: {}, 8: {}, 5: {}, 2: {}, 9: {}, 100: {}, 7: {}, 4: {}, 6: {}}

为什么函数在多处理期间无法创建子字典?通常使用该函数确实会给出正确的输出。

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):
    dic[user] = {}
    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):
    # Pass the user at position i instead of the whole list
    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)

我通过创建一个临时字典 d 然后将 d 分配给 dict[user] 来让它工作。

def random_number_check(user, dic, list2):
    d = {}
    for i in list2:
        d[i] = random.randint(0, 1000)
    dic[user] = d

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    for i in range(10):
        # Pass the user at position i instead of the whole list
        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)

你应该使用 dic[user] = manager.dict()d = {}dic[user] = d 正如@Albin Paul 所说。