文章目录
类似于java的单例模式,python中也有。
例如大模型加载起来很慢,如果每次都加载,那不用干活了,光加载吧。
代码
python
import time
class QwenModelSingleton:
"""
单例模式:保证全局只加载一次模型
"""
_instance = None
_model = None # 用来存放真正的模型对象
def __new__(cls):
# __new__ 是创建实例的第一步,在这里控制"只创建一次"
if cls._instance is None:
cls._instance = super().__new__(cls)
# 只有第一次创建实例时,才执行加载逻辑
cls._instance._load_model()
return cls._instance
def _load_model(self):
"""真正的加载逻辑只在这里执行一次"""
print("🚀 [系统] 正在初始化并加载千问模型到内存... (耗时操作)")
time.sleep(2) # 模拟加载耗时
# 【在这里替换你的真实加载代码】
# self._model = AutoModel.from_pretrained("Qwen/Qwen-7B")
self._model = "Qwen_Model_Obj_Loaded"
print("✅ [系统] 模型加载完成!")
def generate(self, prompt):
"""对外提供推理接口"""
if not self._model:
raise RuntimeError("模型尚未加载")
# 【在这里替换你的真实推理代码】
# return self._model.generate(prompt)
return f"这是千问模型对 '{prompt}' 的回复..."
# ==========================================
# 下面是演示:模拟在两个不同的业务类中使用
# ==========================================
class ChatService:
"""业务类 A:聊天服务"""
def __init__(self):
# 注入单例
self.model = QwenModelSingleton()
def chat(self, text):
return self.model.generate(text)
class SearchService:
"""业务类 B:搜索服务"""
def __init__(self):
# 注入单例
self.model = QwenModelSingleton()
def search_and_summarize(self, text):
# 比如先搜索,再用模型总结
return self.model.generate(f"总结搜索结果关于:{text}")
# ==========================================
# 运行测试
# ==========================================
if __name__ == "__main__":
print("--- 启动服务 A ---")
service_a = ChatService()
print(service_a.chat("你好"))
print("\n--- 启动服务 B ---")
service_b = SearchService()
print(service_b.search_and_summarize("人工智能"))
print("\n--- 再次使用服务 A ---")
# 此时不会再加载模型,直接复用内存中的对象
print(service_a.chat("再见"))