詹聰聰:一種動態引入 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 聰聰與可可
- php例項化物件的例項方法PHP物件
- 聰明的陷阱
- 幽默:智慧而非聰明的五種表現
- Nature:越運動越聰明!
- 慧聰網的外鏈加入技巧與方法
- Python 動態新增例項屬性,例項方法,類屬性,類方法Python
- 名列“全球前50聰明公司”,百度AI還要撬動聰明世界AI
- 聰明優秀
- Python - 物件導向程式設計 - 例項方法、靜態方法、類方法Python物件程式設計
- JS 建立例項物件的四種模式JS物件模式
- JS函式,物件,例項方法,物件方法理解JS函式物件
- C#動態建立介面的實現例項物件C#物件
- 掌握聰明的學習方法,才能獲得好成績
- bean例項化的三種方法Bean
- 理解Python中的類物件、例項物件、屬性、方法Python物件
- 如何聰明地利用待辦事項 APP 完成任務APP
- JavaScript 複習之例項物件與 new 命令JavaScript物件
- 量子計算:聰明人的挑戰
- Protobuf 動態載入 .proto 檔案並操作 Message
- bugku——聰明的小羊(柵欄密碼)密碼
- 區塊鏈之父——中本聰區塊鏈
- 4、Spring IOC容器 Bean物件例項化的3種方式SpringBean物件
- 無法訪問的成員例項化一個方法在角的另一種方法
- 動態的控制Panel的顯隱並控制其內容
- 為什麼智慧合約是'聰明'的?
- 巖田聰之夢終於成真
- shell動態修改yml配置例項
- 靜態工廠方法和例項工廠方法
- Java的幾種建立例項方法的效能對比Java
- 一種動態實現核隔離的方法
- C#例項化物件的三種方式及效能對比C#物件
- 原生js使用物件導向的方法開發選項卡例項教程JS物件
- 簡述動態IPvps以及連線其的方法
- Python是一種物件導向的動態型別語言Python物件型別
- 例項物件和函式物件的區別物件函式
- 3.1.5.4 啟動例項並mount 資料庫資料庫