在多处理中通过键访问字典中的值

Posted

技术标签:

【中文标题】在多处理中通过键访问字典中的值【英文标题】:Accessing values in a dict by key in multiprocessing 【发布时间】:2019-11-14 13:14:16 【问题描述】:

使用多处理模块,我编写了一个服务器来服务dict。现在,尝试通过客户端按键访问该字典,我收到以下错误(server.pyclient.py 在帖子底部):

Traceback (most recent call last):
  File "client.py", line 19, in <module>
    item = my_dict[key]
TypeError: 'AutoProxy[get_dict]' object is not subscriptable

我相信这是因为我 register() 与我的 SyncManager 编辑的 dict 被腌制并作为 AutoProxy 对象传递。当我使用print(dir(my_dict)) 检查 AutoProxy 对象的方法时,我得到了:

['_Client', '__builtins__', '__class__', '__deepcopy__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_address_to_local', '_after_fork', '_authkey', '_callmethod', '_close', '_connect', '_decref', '_exposed_', '_getvalue', '_id', '_idset', '_incref', '_isauto', '_manager', '_mutex', '_serializer', '_tls', '_token', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

这与server.pyprint(dir(my_dict))的输出不同:

['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

看起来这个 Autoproxy 对象保留了 dict 对象的一些方法,但显然不是全部。至关重要的是,它没有保留 __getitem__ 方法,这会阻止我通过键访问项目。

如何通过密钥访问dict 项目?此外,任何关于 Proxys 如何与 Python 多处理一起工作的解释都会非常有帮助。

注意:我不需要修改dict的值,我只需要按键提取即可。

server.py:

from multiprocessing.managers import SyncManager

my_dict = 'item_1': 1, 'item_2':2
def get_my_dict():
    return my_dict

class MyManager(SyncManager):
    pass

if __name__ == "__main__":
    port_num = 4343
    MyManager.register("get_dict", get_my_dict)
    manager = MyManager(("127.0.0.1", port_num), authkey=b"password")
    manager.start()
    input("Press any key to kill server".center(50, "-"))
    manager.shutdown

client.py

from multiprocessing.managers import SyncManager
import sys

class MyManager(SyncManager):
    pass

MyManager.register("get_dict")

if __name__ == "__main__":
    port_num = 4343
    manager = MyManager(("127.0.0.1", port_num), authkey=b"password")
    manager.connect()
    my_dict = manager.get_dict()

    print("dict = %s" % (dir(my_dict)))
    keys = list(my_dict.keys())
    print(keys)
    for key in keys:
        print(my_dict[key])

【问题讨论】:

【参考方案1】:

您可以使用get 来获取字典的元素,无论是哪个版本。

【讨论】:

以上是关于在多处理中通过键访问字典中的值的主要内容,如果未能解决你的问题,请参考以下文章

字典值中的排序列表[重复]

在 VBA 中的字典值中查找最大值/最小值

如何在php中通过键值合并两个多维数组?

从数组值中过滤字典

如何在swift ios中通过键值读取子数据或过滤firebase数据

项目中阶梯费率解决方法,数组中通过键名查找键值