python异步调用远程对象方法

时间:2017-11-02 16:54:19

标签: python asynchronous zeromq rpc python-multiprocessing

我有一个类跟随。

class R(object):
    def __init__(self, initial=0, incr=2):
        self.initial = initial
        self.incr = incr
        self.value = initial

    def add(self):
        time.sleep(1)
        self.value += self.incr

    def mul(self):
        time.sleep(3)
        self.value *= self.incr

    def get(self):
        return self.value

我想创建一个服务器,它将执行以下操作。

  • 对于每个初始请求,它会在不同的进程中创建一个对象 R
  • 对于.add().mul()方法的每次调用,服务器调用该进程并应用相应的调用。但这很耗时,所以它会立即返回。另一方面,远程R进程仍在执行.add().mul()方法'体。
  • 如果服务器收到对.get()方法的调用,则会调用相应的进程并对其应用.get()。但是这次它等待结果,当结果出现时,它会终止远程R对象。

如何实现这一目标?

到目前为止我尝试了什么? 我使用multiprocessing.Process创建了R对象。然后使用multiprocessing.Queue put_nowait向其发送命令。

但似乎我必须自己控制流量。还有其他框架,工具可以做同样的事情吗?

服务器是用zmq编写的,但我愿意将其更改为其他解决方案。

2 个答案:

答案 0 :(得分:1)

在ZeroMQ中完全可行。

为什么要使用不合适的工具浪费CPU /管理费用?

ZeroMQ允许您自适应地启动远程工作器实例和负载平衡/故障安全 - 修复它们的实际性能以及它们(不可) - 可避免的静默退出。

逻辑掌握在你手中,任何由语言或环境驱动的先辈都不需要“强大”的表现。

是的,你必须做流量控制,但这是你的力量,而不是弱点 - 不是吗?

如果您需要获得更高的性能,可以采用这种方式,使用ZeroMQ / ,甚至是更轻量级的&无脂 工具。 - user3666197 11月2日&17; 17 17:08

答案 1 :(得分:0)

构建CeleryLuigi框架是为了满足您的需求。

它们旨在允许跨多个节点的分布式计算,从而抽象出控制流。

您通常最终会关注执行逻辑和设置工作人员。框架应该照顾其余部分。

Celery支持多个排队后端,但我不确定ZeroMQ是否在其中。