Доступ к значениям в диктовке по ключу в многопроцессорной обработке - PullRequest
1 голос
/ 03 июля 2019

Используя многопроцессорный модуль, я написал сервер для обслуживания dict. Теперь, пытаясь получить доступ к этому диктову по ключу с помощью клиента, я получаю следующую ошибку (server.py и client.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

Я полагаю, это связано с тем, что dict, который я register() -едал с моим SyncManager, засолился и передался как AutoProxy объект. Когда я проверяю методы объекта AutoProxy с помощью print(dir(my_dict)), я получаю следующее:

['_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']

Что отличается от вывода print(dir(my_dict)) в server.py:

['__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 элементам по ключу? Также было бы полезно любое объяснение того, как Proxy работает с многопроцессорной обработкой 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 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать get, чтобы получить элемент словаря в любой версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...