请考虑以下内容:
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
从未更新过,这是什么原因?
答案 0 :(得分:0)
这是完全正常的:进程不共享内存(除非您明确要求它们共享)。您要传递给update_dict
的字典将在池的每个进程中复制,然后依次更新其自己的字典副本。父进程中的字典不受此影响。
进程池的实用程序是当它们正在处理 global 事物时,例如文件系统或来自远程客户端的网络连接。
对于处理内存中的数据,您应该使用线程池(在Python中,由于GIL,它通常不是最佳的),或者将共享数据放入共享内存段中(使用multiprocessing.Manager )。