Python bsonrpc原始碼解讀

2022-09-25 23:33:10 字數 1528 閱讀 4101

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) # 解碼器提取完整的資訊

w程式設計客棧hile 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()⽅法,也是通過物件組合實現的。

注:圖中的接⼝為了⼤家容易理解才加上了,原始碼⾥⾯並沒有。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...