当dict(可变dtype)是通过多处理池实现的函数的参数时,为什么python使用'CallByValue'函数调用?

问题描述 投票:0回答:2

注意:这是一个更大问题的虚构示例

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}

为什么输出不同?有没有一种方法可以避免使用“按值调用”样式的函数调用?我想让池使用通过函数调用的引用样式进行的调用

python python-3.x python-multiprocessing pool
2个回答
0
投票

[当您使用Pool且要更改multiprocessingdict等对象。(共享数据)时,您需要使用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

0
投票

/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上明确指定该对象。

© www.soinside.com 2019 - 2024. All rights reserved.