管理器start()抛出AttributeError:无法腌制本地对象'server1。<locals>。<lambda>'

时间:2019-10-10 13:32:43

标签: python python-3.x multiprocessing

我试图创建一个远程管理器,并使用队列在多个进程之间进行通信。我注意到,当我尝试在管理器上使用start方法时,会得到AttributeError: Can't pickle local object 'server1.<locals>.<lambda>',但是当我获取服务器对象然后使用serve_forever时,它将起作用。奇怪的是,在两种情况下,我都有相同的lambda要序列化。

问题是:第一种方法我做错了什么?为什么不起作用?

下面我已经创建了代码的简化版本并粘贴了这两种方法。 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>'

0 个答案:

没有答案