Python bsonrpc源码解读

 更新时间:2021年03月13日 15:11:07   作者:控维通信  
这篇文章主要介绍了Python bsonrpc源码的相关资料,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下

bsonrpc 是python中⼀个基于json或bson的远程过程调⽤的库,提供了服务端与客户端实现,其底层采⽤的是基于TCP连接的通信。

程序结构

bsonrpc主要包括以下⽂件:

  1. concurrent.py:针对两种并发⽅式(threading线程对象、gevent协程对象)涉及的相应组件(Queue,Event,Lock等)提供统⼀的对外的⽣成接⼝:spawn(),new_promise(),new_queue(), new_lock()等;
  2. definitions.py:定义rpc的消息结构和错误编码;
  3. dispatcher.py:rpc的处理调度,路由处理(消息对应的处理函数);
  4. exceptions.py:异常定义;
  5. framing.py:定义不同类实现JSON RPC 2.0标准中的不同消息结构;
  6. interfaces.py:定义提供服务的装饰器;
  7. misc.py:该⽂件中定义了⼀个id⽣成器,从1开始累加。
  8. options.py:定义配置选项。
  9. rpc.py:主要为BSONRpc和JSONRpc类的实现;
  10. socket_queue.py:主要为消息的拆包组包部分;
  11. util.py:系统⼯具。

本⽂主要描述库包中对于不同协议的分包组包的处理,涉及到socket_queue.py和framing.py⽂件,主要采⽤的是对象组合的技术。

解读

socket_queue.py中的SocketQueue类是⽤来处理从socket接收数据,主要的⽅法为_receiver()和put()⽅法,分别对应分包和组包,分包的主要内容如下:

def _receiver(self):
  bbuffer = b''
  while True:
    try:
      chunk = self.socket.recv(self.BUFSIZE) # 从socket上接收数据
      bbuffer = self._to_queue(bbuffer + chunk) # 数据分包
    except DecodingError as e:
      self._queue.put(e)
    # 后⾯省略...
def _to_queue(self, bbuffer):
  b_msg, bbuffer = self.codec.extract_message(bbuffer) # 解码器提取完整的信息
  while b_msg is not None:
    self._queue.put(self.codec.loads(b_msg)) # 解码后的消息放⼊消息队列中等待处理
    b_msg, bbuffer = self.codec.extract_message(bbuffer)
  return bbuffer

组包的主要内容如下:

def put(self, item):
  if self._closed:
    raise BsonRpcError('Attempt to put items to closed queue.')
  msg_bytes = self.codec.into_frame(self.codec.dumps(item)) # 组包
  with self._lock:
    self.socket.sendall(msg_bytes)

如上图所示,程序采⽤的是对象组合的⽅式实现消息分包处理的。对象组合是继承之外的另⼀种选择,对象组合要求被组合的对象具有良好定义的接⼝,通过接⼝的⽅式调⽤其他对象的功能,这个也被“⿊箱复⽤”,因为对象的内部细节是不可⻅的。SocketQueue中依赖Codec的extract_message()接⼝⽅法,不⽤关⼼其具体的实现⽅法。具体实现由JSONCodec和BSONCode进⾏实现。JSONCodec中依赖JSONFrame中的extract_message()接⼝⽅法,该接⼝⽅法的实现由JSONFramingNone、JSONFramingNetstring、JSONFramingRFC7464进⾏实现。SocketQueue消息组包过程依赖于into_frame()⽅法,也是通过对象组合实现的。

注:图中的接⼝为了⼤家容易理解才加上了,源码⾥⾯并没有。

以上就是Python bsonrpc源码解读的详细内容,更多关于Python bsonrpc源码的资料请关注脚本之家其它相关文章!

相关文章

  • 详解 Python 读写XML文件的实例

    详解 Python 读写XML文件的实例

    这篇文章主要介绍了详解 Python 读写XML文件的实例的相关资料,Python 生成XML文件和Python 读取XML 的实例,需要的朋友可以参考下
    2017-08-08
  • Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题

    Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题

    这篇文章主要介绍了Python3中内置类型bytes和str用法及byte和string之间各种编码转换问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Python mutiprocessing多线程池pool操作示例

    Python mutiprocessing多线程池pool操作示例

    这篇文章主要介绍了Python mutiprocessing多线程池pool操作,结合实例形式分析了Python多线程模块multiprocessing进程池相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • 使用Python和Scrapy实现抓取网站数据

    使用Python和Scrapy实现抓取网站数据

    Scrapy是一个功能强大的网络爬虫框架,允许开发者轻松地抓取和解析网站内容,这篇文章主要为大家介绍了如何使用Python的Scrapy库进行网站数据抓取,需要的可以参考一下
    2023-05-05
  • Python列表操作方法详解

    Python列表操作方法详解

    这篇文章主要介绍了Python列表操作方法详解,需要的朋友可以参考下
    2020-02-02
  • Python 爬取淘宝商品信息栏目的实现

    Python 爬取淘宝商品信息栏目的实现

    这篇文章主要介绍了Python 爬取淘宝商品信息栏目的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Django Channel实时推送与聊天的示例代码

    Django Channel实时推送与聊天的示例代码

    这篇文章主要介绍了Django Channel实时推送与聊天的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 详解Python3 对象组合zip()和回退方式*zip

    详解Python3 对象组合zip()和回退方式*zip

    这篇文章主要介绍了Python3 对象组合zip()和回退方式*zip详解,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python基于Tensor FLow的图像处理操作详解

    Python基于Tensor FLow的图像处理操作详解

    这篇文章主要介绍了Python基于Tensor FLow的图像处理操作,结合实例形式分析了Python基于Tensor FLow操作图像解码、缩放、剪切、翻转、调整对比度、明度、饱和度等相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • Django如何使用jwt获取用户信息

    Django如何使用jwt获取用户信息

    这篇文章主要介绍了Django如何使用jwt获取用户信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论