python 异步调用远程对象方法
python call remote object method asynchronously
我有一个 class 如下。
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()
方法的每次调用,服务器 都会调用该进程并应用相应的调用。但是很费时间,所以马上returns。另一方面,远程 R
进程仍在执行 .add()
或 .mul()
方法的主体。
- 如果服务器收到对
.get()
方法的调用,它会调用相应的进程并对其应用.get()
。但这次它等待结果,当结果出现时,它终止远程 R
对象。
如何实现?
到目前为止我尝试了什么?
我使用 multiprocessing.Process
创建了 R 对象。然后使用 multiprocessing.Queue
和 put_nowait
.
向它发送命令
不过看来我得自己控制流量了。有没有其他框架,工具做同样的事情?
服务器是用zmq
编写的,但我愿意将其更改为不同的解决方案。
它们旨在允许跨多个节点进行分布式计算,抽象控制流。
您通常最终要做的是专注于执行逻辑和设置工作人员。框架应该负责其余的工作。
Celery 支持多个队列后端,但我不确定 ZeroMQ 是否在其中。
在 ZeroMQ 中完全可行。
为什么要使用不合适的工具来浪费 CPU/管理费用?
ZeroMQ 允许您自适应地 spin-up 远程 worker-instances 和 load-balance / fail-safe-heal 它们的实际性能以及它们(无法)避免的静默退出。
逻辑掌握在你手中,性能不需要被任何语言或environment-driven先验蚕食。
是的,你必须做流量控制,但这是你这样做的优势,而不是弱点 - 不是吗?
如果您需要获得更多性能,可以使用 ZeroMQ / pyzmq or even a more lightweight & fat-free nanomsg 工具。 – user3666197 17 年 11 月 2 日在 17:08
我有一个 class 如下。
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()
方法的每次调用,服务器 都会调用该进程并应用相应的调用。但是很费时间,所以马上returns。另一方面,远程R
进程仍在执行.add()
或.mul()
方法的主体。 - 如果服务器收到对
.get()
方法的调用,它会调用相应的进程并对其应用.get()
。但这次它等待结果,当结果出现时,它终止远程R
对象。
如何实现?
到目前为止我尝试了什么?
我使用 multiprocessing.Process
创建了 R 对象。然后使用 multiprocessing.Queue
和 put_nowait
.
不过看来我得自己控制流量了。有没有其他框架,工具做同样的事情?
服务器是用zmq
编写的,但我愿意将其更改为不同的解决方案。
它们旨在允许跨多个节点进行分布式计算,抽象控制流。
您通常最终要做的是专注于执行逻辑和设置工作人员。框架应该负责其余的工作。
Celery 支持多个队列后端,但我不确定 ZeroMQ 是否在其中。
在 ZeroMQ 中完全可行。
为什么要使用不合适的工具来浪费 CPU/管理费用?
ZeroMQ 允许您自适应地 spin-up 远程 worker-instances 和 load-balance / fail-safe-heal 它们的实际性能以及它们(无法)避免的静默退出。
逻辑掌握在你手中,性能不需要被任何语言或environment-driven先验蚕食。
是的,你必须做流量控制,但这是你这样做的优势,而不是弱点 - 不是吗?
如果您需要获得更多性能,可以使用 ZeroMQ / pyzmq or even a more lightweight & fat-free nanomsg 工具。 – user3666197 17 年 11 月 2 日在 17:08