开局篇我们说了,RPC框架的四个核心内容
def procRequest(self): # 循环读取并处理收到的客户端请求 while True: req = self.conn.recv() rsp = Response() rsp.id = req.id if req.command == 'sayHello': rsp.result = self.sayHello() elif req.command == 'whoAreYou': rsp.result = self.whoAreYou() else: raise Exception("unknown command") self.conn.send(rsp)
{‘sayHello’ : self.sayHello, ‘whoAreYou‘: self.whoAreYou}。
有这样的dict之后,收到req 之后,只要提取出command字段,然后从dict中找出对应的function,调用该function即可。
基本想法已定,
这个实现很简单,self.services就是上面的dict。通过register()去注册服务,通过get_service()去获取服务名对应的function
class ServiceRegister(object): ''' @服务注册 不考虑线程安全,这里简化起见,也不引入反射机制。 ''' def __init__(self): ''' Constructor ''' self.services = {} ## 注册具体的服务 # @param servicename: 服务名 # @param obj: 具体的对象 def register(self, obj, servicename): if servicename in self.services: print('warning: %s is already registered' % servicename) else: self.services[servicename] = obj def get_service(self, servicename): return self.services[servicename] def list_service(self, servicename=None): if servicename: return str({servicename, self.services[servicename]}) else: return str(self.services)
服务注册:
self.services.register(self.sayHello, 'Server.sayHello', ) self.services.register(self.whoAreYou, 'Server.whoAreYou') self.services.register(self.add, 'Server.add')服务查找
def proc(self, req): rsp = Response() rsp.id = req.id rsp.result = ServiceCaller.call(self.services.get_service(req.command), req.parameter) ......
class ServiceCaller(): def __init__(self): pass @classmethod def call(cls, caller, parameter): if not parameter or len(parameter) == 0: return caller() return caller(**parameter)
class AutoServiceRegister(AbstractServiceRegister): def register_class(self, obj, predicate=None): if not (hasattr(obj, '__class__') and inspect.isclass(obj.__class__)): return False servicename = obj.__class__.__name__ for (name, attr) in inspect.getmembers(obj, predicate): # 系统方法或者私有方法,不添加 if name.startswith('__') or name.startswith('_' + servicename + '__'): continue #print(name) if inspect.ismethod(attr): self.register_method(attr) elif inspect.isfunction(attr): self.register_function(attr, servicename) return True
if __name__ == '__main__': class AServer(object): def __init__(self): pass def sayHello(self): return 'Hello World' def whoAreYou(self): return 'I am server' def __kaos(self): pass def _kaos(self): pass obj = AServer() service = AutoServiceRegister() print(service.register_class(obj)) print(service.list_services()) print(service.get_service('AServer.sayHello'))
True {'AServer': {'sayHello': <bound method AServer.sayHello of <__main__.AServer object at 0x000000000294EA90>>, 'whoAreYou': <bound method AServer.whoAreYou of <__main__.AServer object at 0x000000000294EA90>>, '_kaos': <bound method AServer._kaos of <__main__.AServer object at 0x000000000294EA90>>}} <bound method AServer.sayHello of <__main__.AServer object at 0x000000000294EA90>>
if not (hasattr(obj, '__class__') and inspect.isclass(obj.__class__)): return False类实例的特点就是,包含__class__成员,而且__class__成员的值就是该类的类对象。inspect.isclass就是检测是不是类对象
总结:
1. 引入服务注册的方式也是为了代码解耦,将req的处理与具体的req消息内容解耦。
2. 上面我们 引入了两种服务注册的方式,一种方式是普通的方式,逐个添加方法。另一种方式通过python的“反射”技术,自动查找一个类里面的方法,并自动添加。
3. 方案还是很粗糙的,实际有很多优化的地方。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/crylearner/article/details/46952977