【发布时间】: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.Queue 和put_nowait 向它发送命令。
但看来我必须自己控制流量。有没有其他框架、工具可以做同样的事情?
服务器是用zmq编写的,但我愿意将其更改为不同的解决方案。
【问题讨论】:
-
在 ZeroMQ 中完全可行。为什么使用不适当的工具来浪费 CPU / 开销? ZeroMQ 允许您自适应地启动远程工作实例并负载平衡/故障安全修复它们的实际性能以及它们(不可)避免的静默退出。逻辑在你手中,性能不需要被任何语言或环境驱动的先验所蚕食。是的,您必须进行流量控制,但这是您这样做的优势,而不是弱点 - 不是吗?如果您需要获得更高的性能,可以使用 ZeroMQ 甚至更轻量级且无脂肪的 nanomsg 工具。
-
@user3666197 我用 ZeroMQ 做到了!你的评论给了我很多启发。如果您将其写为答案,我会接受。
-
很高兴它帮助,先生,激发任何进一步的光明行动。祝你好运,敬请期待:o)
标签: python asynchronous zeromq rpc python-multiprocessing