在 python 的 RPC 世界中返回另一个远程对象的远程对象

Posted

技术标签:

【中文标题】在 python 的 RPC 世界中返回另一个远程对象的远程对象【英文标题】:remote objects returning another remote objects in python's RPC world 【发布时间】:2011-01-08 00:30:43 【问题描述】:

我基本上熟悉 Python 中可用的 RPC 解决方案:XML-RPC 和 Pyro。我可以通过在服务器端绑定它来创建一个远程对象,然后我可以在我可以操作的客户端获取代理对象。当我在远程对象上调用某些方法时,例如proxy.get_file() 然后 rpc 机制尝试序列化结果对象(在这种情况下为文件)。这通常是预期的行为,但我需要的是获取一个文件对象作为另一个远程代理对象,而不是将其传输到客户端:

afile_proxy = proxy.get_file()

代替:

afile = proxy.get_file()

我可以在服务器端重新绑定这个对象并在客户端处理这种情况,但这需要一些样板代码。有没有可以为我做这件事的机制/库?例如,它可以使对象保持远程,直到它们成为原始对象。

【问题讨论】:

【参考方案1】:

我找到了一个完全满足我需要的库:RPyC。来自intro:

简单、不可变的 Python 对象(如字符串、整数、元组等)是按值传递的,这意味着将值本身传递到另一端。 所有其他对象都通过引用传递,这意味着对对象的“引用”传递到另一端。这允许应用在被引用对象上的更改反映在实际对象上。

无论如何,感谢您指出“参考”术语。 :)

【讨论】:

【参考方案2】:

我正在参与开发一个新的远程对象交互框架Versile Python (VPy),它执行与您列出的类似的功能。 VPy 正在开发中,当前版本主要用于测试,但请随时查看。

有两种方法可以执行您使用 VPy 描述的远程 I/O 类型。一种是使用远程 native object 引用,例如文件对象类似于 Pyro/RPyC 并访问这些对象类似于如果它们是本地的。

另一种选择是使用 VPy 远程 stream 框架,它非常灵活,可以配置为执行双向流和远程重新定位或截断流等操作。第二种方法的优势在于它支持异步 I/O 加上流框架拆分数据传输以减少往返延迟的影响。

【讨论】:

【参考方案3】:
afile_proxy = proxy.get_file_proxy()

并在 API 中定义 FileProxy 对象是什么。这完全取决于客户端需要对代理做什么。葛名?删除它?获取其内容?

如果您只想跟踪稍后要处理的内容,您甚至可以使用参考(可能是 URL)。这是在网络上使用所有嵌入式内容(例如图像)完成的操作。

【讨论】:

以上是关于在 python 的 RPC 世界中返回另一个远程对象的远程对象的主要内容,如果未能解决你的问题,请参考以下文章

RPC

关于RPC

RPC的简单实现(Python)

基于grpc的流式方式实现双向通讯(python)

Web | 什么是 RPC ?

Python操作rabbitmq系列:进行RPC调用