python - 如何在不同的 Python 多处理核心之间共享带有元组键的全局字典?

标签 python multithreading dictionary multiprocessing threadpool

我有以下代码:(简化)

def main_func():
    anotherDic = {}
    dic = {(1,2):44, (4,6):33, (1,1):4, (2,3):4}
    ks = dic.keys()
    for i in ks:
        func_A(anotherDic, i[0], i[1], dic[i], 5) 

主字典(dic)相当大,for循环迭代了5亿次。我想使用多处理来并行化多核机器上的循环。我已经阅读了几个 SO 问题和多处理库文档,这非常有帮助 video但仍然无法弄清楚。 我希望程序在到达此循环时 fork 成多个线程,并行运行,然后在所有进程完成后,它应该从循环部分之后的行继续在单个进程上执行程序。 func_A从dic接收字典值和键,计算一些简单的操作,并更新anotherDic数据。这是一个独立的进程,只要所有相同的 i[0] 键都由同一进程处理。因此,我无法使用池映射功能来自动在核心之间划分数据。我将按键元组的第一个元素对键进行排序,然后在线程之间手动划分它们。

我如何在进程之间传递/共享非常大的字典(dic)?不同的进程将读取和写入不同的键(即每个进程处理的键与其他进程不同) 如果我找不到这个问题的答案,我只会为每个进程使用较小的临时 dic,最后加入 dic。

然后问题是,我如何强制进程仅在循环部分 fork 并进入多处理器,并在循环之后所有进程加入,然后再继续在单个线程上执行其余代码?

最佳答案

一般答案涉及使用 Manager 对象。改编自文档:

from multiprocessing import Process, Manager

def f(d):
    d[1] += '1'
    d['2'] += 2

if __name__ == '__main__':
    manager = Manager()

    d = manager.dict()
    d[1] = '1'
    d['2'] = 2

    p1 = Process(target=f, args=(d,))
    p2 = Process(target=f, args=(d,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    print d

输出:

$ python mul.py 
{1: '111', '2': 6}

原答案:Python multiprocessing: How do I share a dict among multiple processes?

关于python - 如何在不同的 Python 多处理核心之间共享带有元组键的全局字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38972011/

相关文章:

c# - .NET : Scalability of generic Dictionary

Python 在进程之间共享锁

python - 尝试删除具有 Unicode 名称的文件夹

Python:根据文件内容构建字典

c - 使用 setrlimit 设置线程的堆栈大小

c++ - std::thread 在我调用 join() 之前是否运行?

python - 根据值对 Python 中的字典列表进行分区

python - 如何让python优雅地失败?

javascript - 使用requests-html渲染javascript页面时发生IOError

java - 应用程序中的线程使用