注意:这是一个更大问题的虚构示例
from multiprocessing import Pool
dict1 = {'key1':1}
def alterDict(dict_num):
for key in dict_num:
dict_num[key] = 20000
alterDict(dict1)
print(dict1) # output is {'key1': 20000}
dict1 = {'key1':1}
with Pool(2) as p:
p.map(alterDict,[dict1])
print(dict1) # output is {'key1': 1}
为什么输出不同?有没有一种方法可以避免使用“按值调用”样式的函数调用?我想让池使用通过函数调用的引用样式进行的调用
[当您使用Pool
且要更改multiprocessing
,dict
等对象。(共享数据)时,您需要使用list
。
Sharing state between process
顺便说一句,您应该将import multiprocessing as mp
def alterDict(dict_num):
for key, _ in dict_num.items():
dict_num[key] = 20000
with mp.Manager() as manager:
d = manager.dict()
d['key'] = 1
with manager.Pool() as pool:
pool.map(alterDict, [d])
print(dict(d))
# {'key': 20000} # output
与dict_num.items()
一起使用,否则会出现错误:
items
/usr/local/lib/python3.8/multiprocessing/managers.py in _callmethod(self, methodname, args, kwds)
848 dispatch(conn, None, 'decref', (token.id,))
849 return proxy
--> 850 raise convert_to_error(kind, result)
851
852 def _getvalue(self):
AttributeError: 'NoneType' object has no attribute '_registry'
模块通过产生新进程来工作,其中每个进程都有自己的内存空间(也许它们在不同的计算机上)。如果要在进程之间共享(共享)对象,则必须在multiprocessing
上明确指定该对象。