在多处理池中修改外部字典

Modifying outter dict inside a multiprocessing pool

我正在尝试使用多处理池修改字典(文件)。但是,我做不到。

这是我正在尝试的:

import json
import multiprocessing



def teste1(_dict, _iterable):
    file1[f'{_iterable}'] = {'relevant': True}


file1 = {'item1': {'relevant': False}, 'item2': {'relevant': False}}

pool = multiprocessing.Pool(4)
manager = multiprocessing.Manager()
dicto = manager.dict()
pool.apply_async(teste1, (file1, file1))
print(file1)

然而,它仍然像以前一样打印出来:{'item1': {'relevant': False}, 'item2': {'relevant': False}}

有高尚的人能帮我解决这个问题吗?

您的方法存在多个问题:

  1. 您正试图在多个进程之间共享字典 (file1),但实际上您共享的是它的副本。为了解决这个问题,请参考:multiprocessing: How do I share a dict among multiple processes?

  2. 您正在迭代字典的副本。正在尝试使用字典本身进行索引!

假设您需要的是一个由并行进程更新值的字典,您有两个选择:

一个。跨进程共享字典并迭代 keys,如:

pool.apply_async(teste1, file1.keys())  # assuming file1 is properly shared

乙。更简单的方法,根据并行 运行 teste1 函数的 return 值构建结果字典:

def teste1(dict_key):
    # some logic dependent on dict_key
    return {'relevant': True}


file1 = {'item1': {'relevant': False}, 'item2': {'relevant': False}}

pool = multiprocessing.Pool(4)
manager = multiprocessing.Manager()
dicto = manager.dict()
results = pool.map(teste1, file1.keys())
pool.close()
pool.join()

file2 = {k:v for k,v in zip(file1.keys(), results)}  # file1.keys() preserves the order so results and file1.keys() are corresponding
print(file2)