跨多个进程的共享字典未更新

时间:2019-05-08 15:32:01

标签: python python-3.x

请考虑以下内容:

def update_dict(d, k):
    d[k] = True

这按预期工作:

from functools import partial

my_dict = {}

_ = any(map(partial(update_dict, my_dict), range(5)))

print(my_dict)
# {0: True, 1: True, 2: True, 3: True, 4: True}

但是,当使用multiprocessing.Pool时,输出是不同的:

from functools import partial
from multiprocessing import Pool

my_dict = {}
my_pool = Pool(processes=5)

_ = any(my_pool.imap(partial(update_dict, my_dict), range(5)))

print(my_dict)
# {}

好像my_dict从未更新过,这是什么原因?

1 个答案:

答案 0 :(得分:0)

这是完全正常的:进程不共享内存(除非您明确要求它们共享)。您要传递给update_dict的字典将在池的每个进程中复制,然后依次更新其自己的字典副本。父进程中的字典不受此影响。

进程池的实用程序是当它们正在处理 global 事物时,例如文件系统或来自远程客户端的网络连接。

对于处理内存中的数据,您应该使用线程池(在Python中,由于GIL,它通常不是最佳的),或者将共享数据放入共享内存段中(使用multiprocessing.Manager )。