import asyncio from typing import Optional from .base import BaseInferenceEngine _engine: Optional[BaseInferenceEngine] = None # 懒初始化,确保在事件循环启动后创建 _inference_lock: Optional[asyncio.Lock] = None def get_engine() -> BaseInferenceEngine: if _engine is None: raise RuntimeError("推理引擎未初始化,请先调用 init_engine()") return _engine def get_inference_lock() -> asyncio.Lock: global _inference_lock if _inference_lock is None: _inference_lock = asyncio.Lock() return _inference_lock def init_engine(model_path: str, runtime: str = "ultralytics") -> BaseInferenceEngine: global _engine if runtime == "onnx": from .onnx_adapter import OnnxRuntimeAdapter _engine = OnnxRuntimeAdapter(model_path) else: from .ultralytics_adapter import UltralyticsAdapter _engine = UltralyticsAdapter(model_path) print(f"[mingxi-vision] 加载模型: {model_path}") _engine.warmup() print(f"[mingxi-vision] 引擎就绪: {_engine.__class__.__name__} · {_engine.model_version}") return _engine def reload_engine(model_path: str, runtime: str = "ultralytics") -> BaseInferenceEngine: """热重载模型,调用方必须持有推理锁""" global _engine _engine = None # 释放旧引用,让 GC 回收显存 return init_engine(model_path, runtime)