濮阳杆衣贸易有限公司

主頁 > 知識庫 > Python bsonrpc源碼解讀

Python bsonrpc源碼解讀

熱門標(biāo)簽:汕頭電商外呼系統(tǒng)供應(yīng)商 電銷機(jī)器人 金倫通信 云南地圖標(biāo)注 400電話 申請 條件 鄭州智能外呼系統(tǒng)中心 crm電銷機(jī)器人 北京外呼電銷機(jī)器人招商 賓館能在百度地圖標(biāo)注嗎 南京crm外呼系統(tǒng)排名

bsonrpc 是python中⼀個(gè)基于json或bson的遠(yuǎn)程過程調(diào)⽤的庫,提供了服務(wù)端與客戶端實(shí)現(xiàn),其底層采⽤的是基于TCP連接的通信。

程序結(jié)構(gòu)

bsonrpc主要包括以下⽂件:

  1. concurrent.py:針對兩種并發(fā)⽅式(threading線程對象、gevent協(xié)程對象)涉及的相應(yīng)組件(Queue,Event,Lock等)提供統(tǒng)⼀的對外的⽣成接⼝:spawn(),new_promise(),new_queue(), new_lock()等;
  2. definitions.py:定義rpc的消息結(jié)構(gòu)和錯(cuò)誤編碼;
  3. dispatcher.py:rpc的處理調(diào)度,路由處理(消息對應(yīng)的處理函數(shù));
  4. exceptions.py:異常定義;
  5. framing.py:定義不同類實(shí)現(xiàn)JSON RPC 2.0標(biāo)準(zhǔn)中的不同消息結(jié)構(gòu);
  6. interfaces.py:定義提供服務(wù)的裝飾器;
  7. misc.py:該⽂件中定義了⼀個(gè)id⽣成器,從1開始累加。
  8. options.py:定義配置選項(xiàng)。
  9. rpc.py:主要為BSONRpc和JSONRpc類的實(shí)現(xiàn);
  10. socket_queue.py:主要為消息的拆包組包部分;
  11. util.py:系統(tǒng)⼯具。

本⽂主要描述庫包中對于不同協(xié)議的分包組包的處理,涉及到socket_queue.py和framing.py⽂件,主要采⽤的是對象組合的技術(shù)。

解讀

socket_queue.py中的SocketQueue類是⽤來處理從socket接收數(shù)據(jù),主要的⽅法為_receiver()和put()⽅法,分別對應(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)

如上圖所示,程序采⽤的是對象組合的⽅式實(shí)現(xiàn)消息分包處理的。對象組合是繼承之外的另⼀種選擇,對象組合要求被組合的對象具有良好定義的接⼝,通過接⼝的⽅式調(diào)⽤其他對象的功能,這個(gè)也被“⿊箱復(fù)⽤”,因?yàn)閷ο蟮膬?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()⽅法,也是通過對象組合實(shí)現(xiàn)的。

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

以上就是Python bsonrpc源碼解讀的詳細(xì)內(nèi)容,更多關(guān)于Python bsonrpc源碼的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Python源碼學(xué)習(xí)之PyObject和PyTypeObject
  • Python源碼解析之List
  • python源碼剖析之PyObject詳解
  • python opencv人臉識別考勤系統(tǒng)的完整源碼
  • python 制作手機(jī)歸屬地查詢工具(附源碼)
  • python基于tkinter制作無損音樂下載工具(附源碼)
  • Python源碼學(xué)習(xí)之PyType_Type和PyBaseObject_Type詳解
  • Python制作腳本幫女朋友搶購清空購物車

標(biāo)簽:梅州 西寧 文山 石家莊 錫林郭勒盟 昆明 浙江 懷化

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python bsonrpc源碼解讀》,本文關(guān)鍵詞  Python,bsonrpc,源碼,解讀,Python,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python bsonrpc源碼解讀》相關(guān)的同類信息!
  • 本頁收集關(guān)于Python bsonrpc源碼解讀的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    新乡县| 荆门市| 晴隆县| 连云港市| 宜丰县| 菏泽市| 行唐县| 木兰县| 广宗县| 巴马| 开平市| 新疆| 夹江县| 天台县| 盐亭县| 霍州市| 蒲江县| 合作市| 赤峰市| 华亭县| 桦南县| 河西区| 达孜县| 神池县| 梨树县| 遵化市| 丰台区| 阳新县| 罗源县| 阜南县| 永平县| 乌拉特后旗| 垫江县| 紫阳县| 常山县| 沙田区| 崇州市| 调兵山市| 瓦房店市| 拜泉县| 长汀县|