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



我有以下代码:(简化)

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问题和多处理库文档,这个非常有用的视频,仍然无法弄清楚。我希望程序在到达这个循环时分叉成几个线程,并行运行,然后在所有进程完成后,它应该从循环部分后的行继续在单个进程上运行程序。func_A从dic接收字典值和键,计算一些简单的操作,并更新另一个dic数据。这是一个独立的进程,只要所有相同的i[0]键是由同一进程处理的。因此,我不能使用池映射函数自动划分核之间的数据。我将按键元组的第一个元素对键进行排序,然后在线程之间手动划分它们。

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

那么问题是,我怎么能强迫进程分叉和去多处理器只是为了循环部分,循环后,所有的进程加入之前继续在一个线程上的代码的其余部分?

一般的答案包括使用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:如何在多个进程之间共享字典?

最新更新