Python RPC中远程对象返回另一个远程对象
我对Python中的RPC解决方案有一些了解,比如XML-RPC和Pyro。我可以在服务器端创建一个远程对象,然后在客户端获取一个代理对象,这样我就可以对它进行操作。当我在远程对象上调用某个方法,比如proxy.get_file()时,RPC机制会尝试将结果对象(在这个例子中是一个文件)进行序列化。这通常是预期的行为,但我想要的是将文件对象作为另一个远程代理对象,而不是将它传输到客户端:
afile_proxy = proxy.get_file()
而不是:
afile = proxy.get_file()
我可以在服务器端重新绑定这个对象,并在客户端处理这种情况,但这需要一些额外的代码。有没有什么机制或库可以为我做到这一点?比如说,它可以在对象是基本类型之前一直保持远程状态。
3 个回答
0
afile_proxy = proxy.get_file_proxy()
在API中定义一下什么是FileProxy
对象。这完全取决于客户端想用这个代理做什么。是获取名字?删除它?还是获取它的内容?
如果你只是想跟踪一些稍后要处理的东西,甚至可以只用一个引用(比如一个网址)。这在网页上很常见,比如嵌入的内容,像图片。
1
我正在开发一个新的远程对象交互框架,叫做Versile Python(VPy),它的功能和你提到的那些类似。VPy 目前还在开发中,现在发布的版本主要是为了测试,不过你可以随便看看。
你可以用两种方式在 VPy 中实现你所描述的远程输入输出。一种是使用远程的本地对象引用,比如文件对象,这样就像使用 Pyro 或 RPyC 一样,可以像访问本地对象那样访问这些远程对象。
另一种选择是使用 VPy 的远程流框架,这个框架非常灵活,可以配置成双向流传输,并进行一些操作,比如远程调整流的位置或截断流。第二种方法的好处是它支持异步输入输出,并且流框架会把数据传输分开,以减少往返延迟的影响。
2
我找到了一款完全符合我需求的库:RPyC。在这个介绍中提到:
- 简单且不可变的Python对象(比如字符串、整数、元组等)是通过值传递的,也就是说,值本身会被传到另一边。
- 其他所有对象都是通过引用传递的,这意味着会传递一个指向对象的“引用”到另一边。这样对引用对象所做的修改会直接反映在实际对象上。
总之,谢谢你提到“引用”这个词。:)