詹聰聰:一種動態引入 protobuf 物件並複用其例項的方法
1.引言
基於protobuf的訊息傳輸,一般都有專門的資料結構去儲存protobuf物件。類似於下圖這種,在程式執行中往往需要一次性將所有的protobuf物件載入到記憶體中。再去初始化物件例項來使用,並且物件例項也沒有複用,效率低下。
但是我們測試人員來講,根本不需要用到所有的協議。尤其是在對協議進行壓力測試的時候,寶貴的CPU資源和記憶體資源浪費在一些可能永遠也不會用到的協議上,是非常可惜的。但是,不引入協議是沒有辦法解析protobuf的二進位制流的。為了解決這個矛盾,我利用python的動態載入的語言特性,設計了一種動態引入protobuf物件並複用其例項的方法。
2.設計思路
構造一個物件池,按需引入protobuf物件。物件的引入時機是在protobuf物件首次被使用的時候,從對應的protobuf的py檔案中引入。
2.1預處理
事先遍歷所有protobuf自動生成的py檔案,蒐集所有物件,以json字典的形式寫入到protocol_dict.py中備用。本操作屬於預處理,且只有一次。如下圖所示,json字典存的只是物件的名稱,以字串的形式存放,程式執行時載入很快。
2.2 協議物件池的資料結構定義
協議物件池的資料結構如下:
protocol_pool = {
str(protocol_num): {
"file_name": "prototocol_xxx_pb2",
"protocol_name": "xxx",
"instance": xxx_instance
},
}
2.3 按需載入
引入模組的所需的python庫為importlib
import importlib
protocol_module = importlib.import_module(file_name)
找到模組中的類,需要類的名稱,還需要藉助模組的__dict__
屬性
protocol = protocol_module.__dict__.get(protocol_name)
最後返回物件的例項。
3. 結語
這裡只提供了一種複用的思路,歡迎各種建設性意見,以及其他程式語言的實現。
4.參考程式碼
file_name: protcol_manager.py
import importlib
class ProtocolManager(object):
protocol_instance_pool = dict()
def get_protocol_instance(self, protocol_num):
"""獲取協議物件例項
:param protocol_num: 協議號
:return: 協議物件
"""
instance_dict = self.protocol_instance_pool.get(str(protocol_num))
if instance_dict is None:
from app.utils import protocol_dict
instance_dict = protocol_dict.protocol_dict.get(str(protocol_num))
if instance_dict is None:
return None
else:
self.__add_instance(instance_dict)
self.protocol_instance_pool.update({
str(protocol_num): instance_dict
})
if instance_dict.get("instance") is None:
self.__add_instance(instance_dict)
return instance_dict.get("instance")
@staticmethod
def __add_instance(instance_dict):
"""新增物件例項
:param instance_dict: 物件池的一個元素
"""
file_name = instance_dict.get("file_name")
protocol_name = instance_dict.get("protocol_name")
protocol_module = importlib.import_module(file_name)
protocol = protocol_module.__dict__.get(protocol_name)
instance_dict.update({"instance": protocol()})
protocol_manager = ProtocolManager()
相關文章
- 又拍雲張聰:OpenResty 動態流控的幾種姿勢REST
- 0828-T4 聰聰與可可
- 幽默:智慧而非聰明的五種表現
- 動態引入外部javascript檔案程式碼例項JavaScript
- php例項化物件的例項方法PHP物件
- 慧聰網的外鏈加入技巧與方法
- 名列“全球前50聰明公司”,百度AI還要撬動聰明世界AI
- 對於物件的動態建立例項問題物件
- js實現的動態引入css檔案程式碼例項JSCSS
- 如何為一個例項動態替換方法
- Window中Oracle服務啟動時並不啟動例項的兩種方法Oracle
- 單例項物件動態裝載問題?單例物件
- 用Go例項學習Protobuf編碼Go
- 掌握聰明的學習方法,才能獲得好成績
- 我是一個失聰的程式設計師程式設計師
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- JS 建立例項物件的四種模式JS物件模式
- 量子計算:聰明人的挑戰
- javascript動態建立並執行css程式碼例項JavaScriptCSS
- C#動態建立介面的實現例項物件C#物件
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- JS函式,物件,例項方法,物件方法理解JS函式物件
- javascript 靜態方法和例項方法例項JavaScript
- 程式設計裡的“小聰明”(1)程式設計
- Protobuf 動態載入 .proto 檔案並操作 Message
- 慧聰研究:汽車主動安全技術的發展趨勢
- JavaScript 複習之例項物件與 new 命令JavaScript物件
- Java很傻,但是IDE很聰明JavaIDE
- 【轉載】聰明,和智慧--職場智慧
- 為什麼智慧合約是'聰明'的?
- bugku——聰明的小羊(柵欄密碼)密碼
- 聰明的投資者讀書筆記1筆記
- 演算法提高 聰明的美食家演算法
- Python Class 的例項方法/類方法/靜態方法Python
- 動態的控制Panel的顯隱並控制其內容
- 30歲IT男連續工作一個月 突然失聰
- js--Object的靜態方法和例項方法JSObject
- 如何動態刪除css的偽物件選擇器程式碼例項CSS物件