美文网首页
python使用XML-RPC实现简单远端过程调用

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

作者: KillerManA | 来源:发表于2016-05-21 17:20 被阅读289次

    今天我们来实现一个简单的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实现简单远端过程调用

          本文链接:https://www.haomeiwen.com/subject/bphorttx.html