最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python bsonrpc源碼解讀

 更新時(shí)間:2021年03月13日 15:11:07   作者:控維通信  
這篇文章主要介紹了Python bsonrpc源碼的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下

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

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

bsonrpc主要包括以下⽂件:

  1. concurrent.py:針對(duì)兩種并發(fā)⽅式(threading線程對(duì)象、gevent協(xié)程對(duì)象)涉及的相應(yīng)組件(Queue,Event,Lock等)提供統(tǒng)⼀的對(duì)外的⽣成接⼝:spawn(),new_promise(),new_queue(), new_lock()等;
  2. definitions.py:定義rpc的消息結(jié)構(gòu)和錯(cuò)誤編碼;
  3. dispatcher.py:rpc的處理調(diào)度,路由處理(消息對(duì)應(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開(kāi)始累加。
  8. options.py:定義配置選項(xiàng)。
  9. rpc.py:主要為BSONRpc和JSONRpc類的實(shí)現(xiàn);
  10. socket_queue.py:主要為消息的拆包組包部分;
  11. util.py:系統(tǒng)⼯具。

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

解讀

socket_queue.py中的SocketQueue類是⽤來(lái)處理從socket接收數(shù)據(jù),主要的⽅法為_(kāi)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ì)象具有良好定義的接⼝,通過(guò)接⼝的⽅式調(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消息組包過(guò)程依賴于into_frame()⽅法,也是通過(guò)對(duì)象組合實(shí)現(xiàn)的。

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

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

相關(guān)文章

  • 詳解 Python 讀寫XML文件的實(shí)例

    詳解 Python 讀寫XML文件的實(shí)例

    這篇文章主要介紹了詳解 Python 讀寫XML文件的實(shí)例的相關(guān)資料,Python 生成XML文件和Python 讀取XML 的實(shí)例,需要的朋友可以參考下
    2017-08-08
  • Python3中內(nèi)置類型bytes和str用法及byte和string之間各種編碼轉(zhuǎn)換 問(wèn)題

    Python3中內(nèi)置類型bytes和str用法及byte和string之間各種編碼轉(zhuǎn)換 問(wèn)題

    這篇文章主要介紹了Python3中內(nèi)置類型bytes和str用法及byte和string之間各種編碼轉(zhuǎn)換問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • Python mutiprocessing多線程池pool操作示例

    Python mutiprocessing多線程池pool操作示例

    這篇文章主要介紹了Python mutiprocessing多線程池pool操作,結(jié)合實(shí)例形式分析了Python多線程模塊multiprocessing進(jìn)程池相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • 使用Python和Scrapy實(shí)現(xiàn)抓取網(wǎng)站數(shù)據(jù)

    使用Python和Scrapy實(shí)現(xiàn)抓取網(wǎng)站數(shù)據(jù)

    Scrapy是一個(gè)功能強(qiáng)大的網(wǎng)絡(luò)爬蟲框架,允許開(kāi)發(fā)者輕松地抓取和解析網(wǎng)站內(nèi)容,這篇文章主要為大家介紹了如何使用Python的Scrapy庫(kù)進(jìn)行網(wǎng)站數(shù)據(jù)抓取,需要的可以參考一下
    2023-05-05
  • Python列表操作方法詳解

    Python列表操作方法詳解

    這篇文章主要介紹了Python列表操作方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python 爬取淘寶商品信息欄目的實(shí)現(xiàn)

    Python 爬取淘寶商品信息欄目的實(shí)現(xiàn)

    這篇文章主要介紹了Python 爬取淘寶商品信息欄目的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Django Channel實(shí)時(shí)推送與聊天的示例代碼

    Django Channel實(shí)時(shí)推送與聊天的示例代碼

    這篇文章主要介紹了Django Channel實(shí)時(shí)推送與聊天的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解Python3 對(duì)象組合zip()和回退方式*zip

    詳解Python3 對(duì)象組合zip()和回退方式*zip

    這篇文章主要介紹了Python3 對(duì)象組合zip()和回退方式*zip詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Python基于Tensor FLow的圖像處理操作詳解

    Python基于Tensor FLow的圖像處理操作詳解

    這篇文章主要介紹了Python基于Tensor FLow的圖像處理操作,結(jié)合實(shí)例形式分析了Python基于Tensor FLow操作圖像解碼、縮放、剪切、翻轉(zhuǎn)、調(diào)整對(duì)比度、明度、飽和度等相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • Django如何使用jwt獲取用戶信息

    Django如何使用jwt獲取用戶信息

    這篇文章主要介紹了Django如何使用jwt獲取用戶信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論

榆树市| 恩施市| 绩溪县| 玉田县| 平度市| 璧山县| 绥德县| 尉犁县| 龙海市| 潜江市| 马山县| 延寿县| 清水河县| 滁州市| 鄢陵县| 三亚市| 广元市| 洪湖市| 报价| 平江县| 鄂托克旗| 荥经县| 都昌县| 昌江| 南充市| 赞皇县| 沂南县| 轮台县| 怀仁县| 永福县| 临沧市| 武平县| 玛纳斯县| 保山市| 沛县| 郧西县| 全州县| 咸丰县| 永顺县| 登封市| 贵港市|