python使用XML-RPC实现简单远端过程调用

今天我们来实现一个简单的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化,所以稍微慢一点,如果从实用性的角度来看的话,你需要马上有一个并且可以不完善的远程调用时,这是个不错的选择。

下一节我们来看如何实现远端调用的过程。

你可能感兴趣的:(python使用XML-RPC实现简单远端过程调用)