bsonrpc 是python中⼀个基于json或bson的远程过程调⽤的库,提供了服务端与客户端实现,其底层采⽤的是基于TCP连接的通信。
bsonrpc主要包括以下⽂件:
本⽂主要描述库包中对于不同协议的分包组包的处理,涉及到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源码的资料请关注小牛知识库其它相关文章!
第三部分: 源码解读 我们的最终目标是要使用Node.js开发一款像比特币一样的加密货币。很显然,在开始之前,如果有现成的经验可以学习借鉴,就不用再去“重复制造轮子”,这是目前开发领域的重要共识。 站在巨人肩上,一方面可以快速了解Node.js技术知识,一方面可以对加密货币有一个更加深刻的学习理解,一举两得。这部分咱们就来学习一款这样的产品,具体的方法是: 源码解读:掌握代码的功能,理清代码的运作
为了方便第一部分的解说,在这里简单介绍一下 ruby 的基本知识。这里不会系统介绍编程的技巧方面的东西,读完这章节也不会让你掌握 ruby 的编程方法。
Logstash 和过去很多日志收集系统比,优势就在于其源码是用 Ruby 写的,所以插件开发相当容易。现在已经有两百多个插件可供选择。但是,随之而来的问题就是:大多数框架都用 Java 写,毕竟做大规模系统 Java 有天生优势。而另一个新生代 fluentd 则是标准的 Ruby 产品(即 Matz’s Ruby Interpreter)。logstash 为什么选用 JRuby 来实现,似乎
co@4.6版本不到240行代码,整体来说,还算比较简单。但并不容易阅读 // 核心代码 function co(gen) { // 缓存this var ctx = this; var args = slice.call(arguments, 1) // we wrap everything in a promise to avoid promise chaining, /
作者:杨光 隐藏在 package.json 里的秘密 随便哪个 dva 的项目,只要敲入 npm start 就可以运行启动。之前敲了无数次我都没有在意,直到我准备研究源码的时候才意识到:在敲下这行命令的时候,到底发生了什么呢? 答案要去 package.json 里去寻找。 有位技术大牛曾经告诉过我:看源码之前,先去看 package.json 。看看项目的入口文件,翻翻它用了哪些依赖,对项目
Laravel 是一个非常简洁、优雅的 PHP 开发框架。Laravel 中除了提供最为中心的 Ioc 容器之外,还提供了强大的 路由、数据库模型 等常用功能模块。