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

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:如何从子进程修改在主进程中创建的字典?

如何在python中读取和写入字典到外部文件? [复制]

数据字典的含义及主要作用是什么?

如何在多部分 API 中发送 [String:Any] 字典?

Gunicorn 在多处理进程和工作进程之间共享内存