Я пытался создать удаленный менеджер и использовать очередь для связи между несколькими процессами. Я заметил, что когда я пытаюсь использовать метод 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>'