Диспетчер start () выбрасывает AttributeError: Невозможно выбрать локальный объект 'server1. <locals>. <lambda>' - PullRequest
0 голосов
/ 10 октября 2019

Я пытался создать удаленный менеджер и использовать очередь для связи между несколькими процессами. Я заметил, что когда я пытаюсь использовать метод start на менеджере, я получаю AttributeError: Can't pickle local object 'server1.<locals>.<lambda>', но когда я получаю объект сервера и затем использую serve_forever, это работает. Странно то, что в обоих случаях у меня одна и та же лямбда для сериализации.

Вопрос: что я делаю неправильно в первом подходе? Почему это не работает?

Ниже я создал упрощенную версию кода и вставил оба метода. server1 () не работает, server2 () - это рабочий метод. Я использую Python 3.7.4

from multiprocessing.managers import BaseManager
from multiprocessing import Queue

class QueueManager(BaseManager):
    pass

def server1():
    items_queue = Queue()
    QueueManager.register('get_items_queue', callable=lambda: items_queue)
    m = QueueManager(address=('localhost', 50000), authkey=b'auth')

    m.start()


def server2():
    items_queue = Queue()
    QueueManager.register('get_items_queue', callable=lambda: items_queue)
    m = QueueManager(address=('localhost', 50000), authkey=b'auth')

    s = m.get_server()
    s.serve_forever()

if __name__ == "__main__":
    server1()
    # server2()

При вызове server1 () я получаю AttributeError: Can't pickle local object 'server1.<locals>.<lambda>'

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