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

2016-05-21  本文已影响289人  KillerManA

今天我们来实现一个简单的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的服务端,关键点主要有以下几点:

写完了服务端的代码,那么我们继续来编写客户端的代码,看一下客户端如何调用服务器的代码:

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

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

上一篇 下一篇

猜你喜欢

热点阅读