【问题标题】:python call remote object method asynchronouslypython异步调用远程对象方法
【发布时间】:2017-11-02 16:54:19
【问题描述】:

我有一个像下面这样的课程。

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.Queueput_nowait 向它发送命令。

但看来我必须自己控制流量。有没有其他框架、工具可以做同样的事情?

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

【问题讨论】:

  • 在 ZeroMQ 中完全可行。为什么使用不适当的工具来浪费 CPU / 开销? ZeroMQ 允许您自适应地启动远程工作实例并负载平衡/故障安全修复它们的实际性能以及它们(不可)避免的静默退出。逻辑在你手中,性能不需要被任何语言或环境驱动的先验所蚕食。是的,您必须进行流量控制,但这是您这样做的优势,而不是弱点 - 不是吗?如果您需要获得更高的性能,可以使用 ZeroMQ 甚至更轻量级且无脂肪的 nanomsg 工具。
  • @user3666197 我用 ZeroMQ 做到了!你的评论给了我很多启发。如果您将其写为答案,我会接受。
  • 很高兴它帮助,先生,激发任何进一步的光明行动。祝你好运,敬请期待:o)

标签: python asynchronous zeromq rpc python-multiprocessing


【解决方案1】:

在 ZeroMQ 中完全可行。


为什么要使用不合适的工具来浪费 CPU / 开销?

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

逻辑在你手中,性能不必被任何语言或环境驱动的先验所蚕食

是的,您必须进行流量控制,但这是您这样做的优势,而不是弱点 - 不是吗?

如果您的需求是获得更多性能,可以这样,使用 ZeroMQ / 甚至更轻量级且无脂肪的@ 987654322@ 工具。 – user3666197 2017 年 11 月 2 日 17:08

【讨论】:

    【解决方案2】:

    CeleryLuigi 框架旨在满足您的需求。

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

    您通常最终会关注执行逻辑并设置工作人员。框架应该负责其余的工作。

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

    【讨论】:

    • 你确定 celery 可以处理有状态的任务吗?在这里,我的任务是有状态的。如果你调用 add()、mul() 和 get(),它应该返回最终结果。
    • 我想您可以轻松地跟踪全局变量中的状态或将@app.task 装饰器应用于类方法并将结果存储在其属性中。对于更复杂的情况,我会使用 Redis 或 Memcached 等后端来存储持久数据。您可以在documentation 中阅读有关状态和结果的更多信息。
    • 恕我直言,将持久性数据存储到 (cit.:) "Redis 或 Memcached 等后端 “如果谈到 O/P 清晰且显而易见的高性能分布式计算,这是一个非常昂贵的步骤。
    • 我想说的不是那么清楚和明显,因为 OP 声称 addmul 操作是“耗时的”。在我看来,OP 更倾向于抽象任务流的管理:“看来我必须自己控制流程。还有其他框架、工具可以做同样的事情吗?”。
    猜你喜欢
    • 2014-09-28
    • 2022-11-15
    • 2010-09-05
    • 1970-01-01
    • 2010-11-17
    • 2017-02-06
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多