【问题标题】:Strange issues with multiprocessing with zeroRPCzeroRPC 多处理的奇怪问题
【发布时间】:2015-01-27 17:05:03
【问题描述】:

所以,我正在为一个宠物项目使用 ZeroRPC 和 Tornado,并且在将 ZeroRPC 与 python 的多处理库结合使用时遇到了一些问题。具体来说,我正在以编程方式创建和运行新的 ZeroRPC 服务器,但通常在运行时,zerorpc 服务器处于阻塞状态,所以我的想法是将其放入另一个进程中,如下所示:

 server = zerorpc.Server(FuncWrapper())
 server.bind(server_address)
 process = multiprocessing.Process(target=server.run)
 process.start()

但是,当我这样做时,调用 RPC 服务器会挂起,这是未正确实例化端点时的典型行为。但是,如果我只是让服务器运行阻塞并像这样调用它:

 serhouldver = zerorpc.Server(FuncWrapper())
 server.bind(server_address)
 server.run()

一切正常。我的理解是这两个实现应该是等价的,但不知何故它们不是。

有什么想法吗?

【问题讨论】:

    标签: python multiprocessing rpc zeromq zerorpc


    【解决方案1】:

    zerorpc 使用 gevent 进行协作异步 IO。您可能想了解一下 tornado、多处理和 gevent 是如何一起发挥作用的。

    我能说的:

    server = zerorpc.Server(FuncWrapper())
    server.bind(server_address)
    process = multiprocessing.Process(target=server.run)
    process.start()
    

    第 1 行和第 2 行正在当前进程上创建和绑定端口。但在第 3 行和第 4 行,我猜想发生的是:

    • fork被调用,进程中的所有线程都丢失在fork中
    • 任何 zeromq 套接字和上下文现在都死了(不再有线程)。好消息是,可以销毁上下文,然后创建一个新上下文(请参阅http://lists.zeromq.org/pipermail/zeromq-dev/2014-January/024536.html)。
    • 现在您在本地进程上打开了一个端口,其中有一个活动的 zeromq 套接字,但没有人从这个套接字读取(因此当您与它交谈时没有反应)。
    • 另一方面,在多进程的进程中,zerorpc 正在运行,在原始zmq 套接字的relics 上调用recv。什么都不会发生,zeromq 已经死了。

    未经测试,我只能猜测在新进程中完全运行zerorpc应该可以工作:

    def ZeroRPC_Service():
      server = zerorpc.Server(FuncWrapper())
      server.bind(server_address)
      server.run()
    
    process = multiprocessing.Process(target=ZeroRPC_Service)
    process.start()
    

    然后通过一些Manager对象或多进程提供的其他共享内存服务,你可以让新进程中的zerorpc服务器访问并与你的本地进程共享数据。

    顺便说一句,如果你想要做的是调用 server.run() 而不阻塞,如果你只使用 gevent,我会告诉你简单地在它自己的协程中运行它:

    server = zerorpc.Server(FuncWrapper())
    server.bind(server_address)
    server_coro = gevent.spawn(server.run)
    

    也许你可以直接从 tornado coroutine/async 函数调用server.run。也许有一种方法可以整合 gevent 和 tornado(如此链接建议:https://bmmh.wordpress.com/2012/10/07/tornado-and-gevent/),我目前还没有足够的知识来帮助您。

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2017-07-19
      • 2011-03-23
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2011-07-17
      相关资源
      最近更新 更多