Python bsonrpc源碼解讀
bsonrpc 是python中⼀個(gè)基于json或bson的遠(yuǎn)程過程調(diào)⽤的庫,提供了服務(wù)端與客戶端實(shí)現(xiàn),其底層采⽤的是基于TCP連接的通信。
程序結(jié)構(gòu)
bsonrpc主要包括以下⽂件:
- concurrent.py:針對(duì)兩種并發(fā)⽅式(threading線程對(duì)象、gevent協(xié)程對(duì)象)涉及的相應(yīng)組件(Queue,Event,Lock等)提供統(tǒng)⼀的對(duì)外的⽣成接⼝:spawn(),new_promise(),new_queue(), new_lock()等;
- definitions.py:定義rpc的消息結(jié)構(gòu)和錯(cuò)誤編碼;
- dispatcher.py:rpc的處理調(diào)度,路由處理(消息對(duì)應(yīng)的處理函數(shù));
- exceptions.py:異常定義;
- framing.py:定義不同類實(shí)現(xiàn)JSON RPC 2.0標(biāo)準(zhǔn)中的不同消息結(jié)構(gòu);
- interfaces.py:定義提供服務(wù)的裝飾器;
- misc.py:該⽂件中定義了⼀個(gè)id⽣成器,從1開始累加。
- options.py:定義配置選項(xiàng)。
- rpc.py:主要為BSONRpc和JSONRpc類的實(shí)現(xiàn);
- socket_queue.py:主要為消息的拆包組包部分;
- util.py:系統(tǒng)⼯具。
本⽂主要描述庫包中對(duì)于不同協(xié)議的分包組包的處理,涉及到socket_queue.py和framing.py⽂件,主要采⽤的是對(duì)象組合的技術(shù)。
解讀
socket_queue.py中的SocketQueue類是⽤來處理從socket接收數(shù)據(jù),主要的⽅法為_receiver()和put()⽅法,分別對(duì)應(yīng)分包和組包,分包的主要內(nèi)容如下:
def _receiver(self): bbuffer = b'' while True: try: chunk = self.socket.recv(self.BUFSIZE) # 從socket上接收數(shù)據(jù) bbuffer = self._to_queue(bbuffer + chunk) # 數(shù)據(jù)分包 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)) # 解碼后的消息放⼊消息隊(duì)列中等待處理 b_msg, bbuffer = self.codec.extract_message(bbuffer) return bbuffer
組包的主要內(nèi)容如下:
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)
如上圖所示,程序采⽤的是對(duì)象組合的⽅式實(shí)現(xiàn)消息分包處理的。對(duì)象組合是繼承之外的另⼀種選擇,對(duì)象組合要求被組合的對(duì)象具有良好定義的接⼝,通過接⼝的⽅式調(diào)⽤其他對(duì)象的功能,這個(gè)也被“⿊箱復(fù)⽤”,因?yàn)閷?duì)象的內(nèi)部細(xì)節(jié)是不可⻅的。SocketQueue中依賴Codec的extract_message()接⼝⽅法,不⽤關(guān)⼼其具體的實(shí)現(xiàn)⽅法。具體實(shí)現(xiàn)由JSONCodec和BSONCode進(jìn)⾏實(shí)現(xiàn)。JSONCodec中依賴JSONFrame中的extract_message()接⼝⽅法,該接⼝⽅法的實(shí)現(xiàn)由JSONFramingNone、JSONFramingNetstring、JSONFramingRFC7464進(jìn)⾏實(shí)現(xiàn)。SocketQueue消息組包過程依賴于into_frame()⽅法,也是通過對(duì)象組合實(shí)現(xiàn)的。
注:圖中的接⼝為了⼤家容易理解才加上了,源碼⾥⾯并沒有。
以上就是Python bsonrpc源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于Python bsonrpc源碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用pyinstaller打包django的方法實(shí)現(xiàn)
本文主要介紹了使用pyinstaller打包django的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Python統(tǒng)計(jì)文本詞匯出現(xiàn)次數(shù)的實(shí)例代碼
這篇文章主要介紹了Python統(tǒng)計(jì)文本詞匯出現(xiàn)次數(shù),這種問題在統(tǒng)計(jì)文本詞匯的次數(shù)時(shí)經(jīng)常會(huì)遇到,今天給大家分享解決方案,通過實(shí)例代碼給大家講解,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)的系統(tǒng)實(shí)用log類實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的系統(tǒng)實(shí)用log類,實(shí)例分析了Python基于logging模塊實(shí)現(xiàn)日志類的相關(guān)技巧,需要的朋友可以參考下2015-06-06Python串口通信的接收與發(fā)送的實(shí)現(xiàn)
串口通信是指通過串口進(jìn)行數(shù)據(jù)傳輸?shù)囊环N通信方式,本文就來介紹一下Python串口通信的接收與發(fā)送的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11使用Python實(shí)現(xiàn)為PDF文檔設(shè)置背景色或背景圖
PDF作為一種跨平臺(tái)、高保真的文件格式被廣泛應(yīng)用,這篇文章主要為大家詳細(xì)介紹了如何使用Python代碼對(duì)PDF文檔進(jìn)行頁面背景色或背景圖片的設(shè)置,需要的可以參考下2024-04-04Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成為image的方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成為image的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10利用Python實(shí)現(xiàn)從PDF到CSV的轉(zhuǎn)換
將PDF轉(zhuǎn)換為CSV極大地提升了數(shù)據(jù)的實(shí)用價(jià)值,Python作為一種強(qiáng)大的編程語言,能夠高效完成這一轉(zhuǎn)換任務(wù),本文將介紹如何利用Python實(shí)現(xiàn)從PDF到CSV的轉(zhuǎn)換,需要的朋友可以參考下2024-07-07