python单例模式、大模型一次加载多次复用

文章目录

类似于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("再见"))
相关推荐
兵慌码乱41 分钟前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
hboot2 小时前
AI工程师第三课 - 机器学习基础
python·scikit-learn·kaggle
顾林海7 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱10 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽14 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码15 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱1 天前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵1 天前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python