【问题标题】: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 是一种不好的做法,因为它与标准库中的默认名称重叠。
  • 嗯,这修改了字典。但是,我怎样才能在给定的函数上对其进行迭代呢?

标签: python python-3.x dictionary multiprocessing python-multiprocessing


【解决方案1】:

您的方法存在多个问题:

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

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

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

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
  • 太棒了。谢谢!
  • 只是想知道:有没有更好的工具呢?
猜你喜欢
  • 2016-12-06
  • 2017-10-12
  • 1970-01-01
  • 2023-02-23
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
相关资源
最近更新 更多