溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python bsonrpc源碼是什么

發(fā)布時間:2021-03-15 10:46:10 來源:億速云 閱讀:235 作者:TREX 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Python bsonrpc源碼是什么”,在日常操作中,相信很多人在Python bsonrpc源碼是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python bsonrpc源碼是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

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

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

Python bsonrpc源碼是什么

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)和錯誤編碼;

  3. dispatcher.py:rpc的處理調(diào)度,路由處理(消息對應(yīng)的處理函數(shù));

  4. exceptions.py:異常定義;

  5. framing.py:定義不同類實現(xiàn)JSON RPC 2.0標準中的不同消息結(jié)構(gòu);

  6. interfaces.py:定義提供服務(wù)的裝飾器;

  7. misc.py:該?件中定義了?個id?成器,從1開始累加。

  8. options.py:定義配置選項。

  9. rpc.py:主要為BSONRpc和JSONRpc類的實現(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)) # 解碼后的消息放?消息隊列中等待處理
    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)

Python bsonrpc源碼是什么

如上圖所示,程序采?的是對象組合的?式實現(xiàn)消息分包處理的。對象組合是繼承之外的另?種選擇,對象組合要求被組合的對象具有良好定義的接?,通過接?的?式調(diào)?其他對象的功能,這個也被“?箱復(fù)?”,因為對象的內(nèi)部細節(jié)是不可?的。SocketQueue中依賴Codec的extract_message()接??法,不?關(guān)?其具體的實現(xiàn)?法。具體實現(xiàn)由JSONCodec和BSONCode進?實現(xiàn)。JSONCodec中依賴JSONFrame中的extract_message()接??法,該接??法的實現(xiàn)由JSONFramingNone、JSONFramingNetstring、JSONFramingRFC7464進?實現(xiàn)。SocketQueue消息組包過程依賴于into_frame()?法,也是通過對象組合實現(xiàn)的。

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

到此,關(guān)于“Python bsonrpc源碼是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI