在多处理池中修改外部字典
Posted
技术标签:
【中文标题】在多处理池中修改外部字典【英文标题】:Modifying outter dict inside a multiprocessing pool 【发布时间】:2021-04-26 01:27:17 【问题描述】:我正在尝试使用多处理池修改字典(文件)。但是,我做不到。
这是我正在尝试的:
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
一位高尚的灵魂能帮我解决这个问题吗?
【问题讨论】:
调用变量file
是一种不好的做法,因为它与标准库中的默认名称重叠。
嗯,这修改了字典。但是,我怎样才能在给定的函数上对其进行迭代呢?
【参考方案1】:
您的方法存在多个问题:
您正试图在多个进程之间共享字典 (file1
),但实际上是在共享它的副本。为了解决这个问题请参考:multiprocessing: How do I share a dict among multiple processes?
您正在遍历字典的副本。尝试使用字典本身进行索引!
假设您需要的是一个字典,其中的值由并行进程更新,您有两种选择:
A.跨进程共享字典并遍历 keys,例如:
pool.apply_async(teste1, file1.keys()) # assuming file1 is properly shared
B.更简单的方法是根据并行运行 teste1
函数的返回值构造结果字典:
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)
【讨论】:
第二个解决方案我收到了TypeError: 'ApplyResult' object is not iterable
。
确实如此。这里应该有map
而不是apply_async
。
太棒了。谢谢!
只是想知道:有没有更好的工具呢?以上是关于在多处理池中修改外部字典的主要内容,如果未能解决你的问题,请参考以下文章
python multiprocessing:如何从子进程修改在主进程中创建的字典?