• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python bsonrpc源码解读

    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源码学习之PyObject和PyTypeObject
    • Python源码解析之List
    • python源码剖析之PyObject详解
    • python opencv人脸识别考勤系统的完整源码
    • python 制作手机归属地查询工具(附源码)
    • python基于tkinter制作无损音乐下载工具(附源码)
    • Python源码学习之PyType_Type和PyBaseObject_Type详解
    • Python制作脚本帮女朋友抢购清空购物车
    上一篇:使用python把json文件转换为csv文件
    下一篇:如何用python合并多个excel文件
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python bsonrpc源码解读 Python,bsonrpc,源码,解读,Python,