在多处理池中修改外部字典
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}}
有高尚的人能帮我解决这个问题吗?
您的方法存在多个问题:
您正试图在多个进程之间共享字典 (file1
),但实际上您共享的是它的副本。为了解决这个问题,请参考:multiprocessing: How do I share a dict among multiple processes?
您正在迭代字典的副本。正在尝试使用字典本身进行索引!
假设您需要的是一个由并行进程更新值的字典,您有两个选择:
一个。跨进程共享字典并迭代 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)
我正在尝试使用多处理池修改字典(文件)。但是,我做不到。
这是我正在尝试的:
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}}
有高尚的人能帮我解决这个问题吗?
您的方法存在多个问题:
您正试图在多个进程之间共享字典 (
file1
),但实际上您共享的是它的副本。为了解决这个问题,请参考:multiprocessing: How do I share a dict among multiple processes?您正在迭代字典的副本。正在尝试使用字典本身进行索引!
假设您需要的是一个由并行进程更新值的字典,您有两个选择:
一个。跨进程共享字典并迭代 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)