今天我们来实现一个简单的rpc调用,首先是一个简单的例子:
from xmlrpc.server import SimpleXMLRPCserver
class KeyValueServer:
_rpc_methods_ = ['get', 'set', 'delete', 'exits', 'keys']
def __init__(self, address):
self._data = []
self._serv = SimpleXMLPRCServer(address, allow_none=True)
for name in self._rpc_methods_:
self._serv.regist_function(getattr(self, name))
def get(self, name):
return self._data[name]
def set(self, name, value):
self._data[name] = value
def delete(self, name):
self._data[name]
def exits(self, name):
return name in self._data
def keys(self):
return list(self._data)
def serve_forever(self):
self._serv.serve_forever()
if "__name__" == "__main__":
kvserv = KeyValueServer(('', 15000))
kvserv.serve_forever()
这里的这个简单例子是建立一个rpc的服务端,关键点主要有以下几点:
- rpc_methods为自己定义的方法集,可以在里面添加我们需要自定义的方法。
- 实例化服务端之后,切记把我们自己定义的方法注册到服务端,这里的注册使用循环获取自己的属性来实现,不清楚getattr的同学可以自己学习一下这个常用的方法。
- 最后就是启动服务serve_forever()方法。
写完了服务端的代码,那么我们继续来编写客户端的代码,看一下客户端如何调用服务器的代码:
from xmlrpc.client import ServerProxy
s = ServerProxy('http://localhost:15000', allow_none=True)
s.set('foo', 'bar')
s.set('spam', [1,2,3])
就这么简单的代码可以创建一个端的代理,在这个代理的实例上面可以进行属性设置,其实已经通过内部实现进行远程调用了,从我们的视角看来就行是在本地端调用一样。
我们可以这样进行调用:
>>>s.keys()
['foo', 'spam']
还可以使用get, 等一些列自定义方法。
再来分析一下我们的这个远程调用代码,这个调用的瓶颈在于性能,因为服务器端是已单线程实现的,也许你会说我可以已多线程的方式运行,但是这个RPC会将所有的数据进行XML化,所以稍微慢一点,如果从实用性的角度来看的话,你需要马上有一个并且可以不完善的远程调用时,这是个不错的选择。
下一节我们来看如何实现远端调用的过程。