【问题标题】:Concurrent Tasks/Children Processes in ZeroRPC serverZeroRPC 服务器中的并发任务/子进程
【发布时间】:2017-10-24 22:19:36
【问题描述】:

我正在使用 ZeroRPC 服务器来实现服务。该服务的一些功能是长时间的 CPU 密集型任务。由于我不希望 RPC 调用阻塞,因此必须适当处理它们。考虑到 GIL,线程似乎不是一个合适的选择。我尝试过多处理,但子进程无法作为 RPC 客户端连接到另一个(不相关的)RPC 服务器。请参阅下面的代码。每次调用spin_off_worker() 时,我都能够生成多个子进程,这一点很重要。在 ZeroRPC 服务器中处理/设计这些长期 CPU 密集型任务的最佳方式是什么?

RPC 服务器 #1

import zerorpc
import multiprocessing
import time
import threading

class Foo(object):

    def heavy_task(self):
        # some long processing...

        # this RPC call never gets made...
        cli = zerorpc.Client(connect_to="tcp://0.0.0.0:3334", timeout=30, heartbeat=5)
        cli.test()
        cli.close()
        return

    def spin_off_worker(self):
        s = multiprocessing.Process(target=self.heavy_task)
        s.start()
        s.join()

def start():
    s = zerorpc.Server(Foo(), heartbeat=5)
    s.bind("tcp://0.0.0.0:3333")
    s.run()
    return s

svr_proc = multiprocessing.Process(target=start)
svr_proc.start()

RPC 服务器 2

import zerorpc
import time
class Foo(object):
    def test(self):
        print "TIGR"

s = zerorpc.Server(Foo(), heartbeat=5)
s.bind("tcp://0.0.0.0:3334")
s.run()

【问题讨论】:

    标签: zerorpc


    【解决方案1】:

    您的解决方案方向正确。它只需要一些调整:

    • zerorpc 需要 gevent,因此在协作协程环境中运行。因为您的工作人员(服务器#2)进程将占用 CPU 一段时间,zerorpc 将错过心跳。您可以禁用主(服务器#1)和工作人员(服务器#2)进程之间的心跳。在两边设置heartbeat=None

    • 由于您正在进行本地进程间通信,因此您不妨使用本地 unix 套接字(如果您可以访问系统上的 unix 套接字)。使用类似unix://workers.sock 的东西。这可能比在途中拥有完整的 TCP 堆栈更有效。

    无论如何,心跳在网络上比在同一台机器上本地更重要。如果想通过网络在另一台机器上运行您的工作程序,请执行以下操作:客户端机器 -> [zerorpc heartbeat] -> 服务器机器 -> [local zerorpc no heartbeat] -> 工作进程。

    注意:您不必为每个 heavy_task 调用都实例化一个新的 zerorpc 客户端。您可以反复使用同一个实例。

    【讨论】:

    • 感谢您的反馈,这非常有用。然而,这并没有解决问题。主要问题是当服务器#1 的客户端调用spin_off_worker() 时,会创建一个执行heavy_task() 函数的子进程。此子进程无法与服务器#2 通信。
    • 确保使用 gevent.subprocess。如果不是,则在等待子进程终止时,您将阻塞主线程。
    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2015-10-07
    相关资源
    最近更新 更多