Python bsonrpc源码解读
bsonrpc是python中⼀个基于json或bson的远程过程调⽤的库,提供了服务端与客户端实现,其底层采⽤的是基于TCP连接的通信。
程序结构
bsonrpc主要包括以下⽂件:
- concurrent.py:针对两种并发⽅式(threading线程对象、gevent协程对象)涉及的相应组件(Queue,Event,Lock等)提供统⼀的对外的⽣成接⼝:spawn(),new_promise(),new_queue(),new_lock()等;
- definitions.py:定义rpc的消息结构和错误编码;
- dispatcher.py:rpc的处理调度,路由处理(消息对应的处理函数);
- exceptions.py:异常定义;
- framing.py:定义不同类实现JSONRPC2.0标准中的不同消息结构;
- interfaces.py:定义提供服务的装饰器;
- misc.py:该⽂件中定义了⼀个id⽣成器,从1开始累加。
- options.py:定义配置选项。
- rpc.py:主要为BSONRpc和JSONRpc类的实现;
- socket_queue.py:主要为消息的拆包组包部分;
- util.py:系统⼯具。
本⽂主要描述库包中对于不同协议的分包组包的处理,涉及到socket_queue.py和framing.py⽂件,主要采⽤的是对象组合的技术。
解读
socket_queue.py中的SocketQueue类是⽤来处理从socket接收数据,主要的⽅法为_receiver()和put()⽅法,分别对应分包和组包,分包的主要内容如下:
def_receiver(self): bbuffer=b'' whileTrue: try: chunk=self.socket.recv(self.BUFSIZE)#从socket上接收数据 bbuffer=self._to_queue(bbuffer+chunk)#数据分包 exceptDecodingErrorase: self._queue.put(e) #后⾯省略... def_to_queue(self,bbuffer): b_msg,bbuffer=self.codec.extract_message(bbuffer)#解码器提取完整的信息 whileb_msgisnotNone: self._queue.put(self.codec.loads(b_msg))#解码后的消息放⼊消息队列中等待处理 b_msg,bbuffer=self.codec.extract_message(bbuffer) returnbbuffer
组包的主要内容如下:
defput(self,item): ifself._closed: raiseBsonRpcError('Attempttoputitemstoclosedqueue.') msg_bytes=self.codec.into_frame(self.codec.dumps(item))#组包 withself._lock: self.socket.sendall(msg_bytes)
如上图所示,程序采⽤的是对象组合的⽅式实现消息分包处理的。对象组合是继承之外的另⼀种选择,对象组合要求被组合的对象具有良好定义的接⼝,通过接⼝的⽅式调⽤其他对象的功能,这个也被“⿊箱复⽤”,因为对象的内部细节是不可⻅的。SocketQueue中依赖Codec的extract_message()接⼝⽅法,不⽤关⼼其具体的实现⽅法。具体实现由JSONCodec和BSONCode进⾏实现。JSONCodec中依赖JSONFrame中的extract_message()接⼝⽅法,该接⼝⽅法的实现由JSONFramingNone、JSONFramingNetstring、JSONFramingRFC7464进⾏实现。SocketQueue消息组包过程依赖于into_frame()⽅法,也是通过对象组合实现的。
注:图中的接⼝为了⼤家容易理解才加上了,源码⾥⾯并没有。
以上就是Pythonbsonrpc源码解读的详细内容,更多关于Pythonbsonrpc源码的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。