Procházet zdrojové kódy

避免线程冲突

lxylxy123321 před 1 týdnem
rodič
revize
8dde5752e2
1 změnil soubory, kde provedl 10 přidání a 8 odebrání
  1. 10 8
      backend/app/services/model_service.py

+ 10 - 8
backend/app/services/model_service.py

@@ -42,17 +42,19 @@ async def download_model(model_id: str, use_modelscope: bool = False) -> dict[st
     """从 HF 或 ModelScope 下载模型到本地缓存。"""
     try:
         if use_modelscope:
-            import subprocess
+            import asyncio
+            from modelscope import snapshot_download as ms_download
 
-            # 使用 modelscope CLI 下载,避免 SDK API 兼容问题
             download_dir = str(settings.models_dir / model_id.replace("/", "_"))
-            proc = subprocess.run(
-                ["modelscope", "download", "--model", model_id, "--local_dir", download_dir],
-                capture_output=True, text=True, timeout=3600,
+
+            # 在线程池中同步执行,避免与 asyncio 事件循环冲突
+            local_path = await asyncio.to_thread(
+                ms_download, model_id, cache_dir=download_dir
             )
-            if proc.returncode != 0:
-                raise RuntimeError(f"modelscope CLI failed: {proc.stderr}")
-            local_path = download_dir
+            if hasattr(local_path, "resolve"):
+                local_path = str(local_path.resolve())
+            if not local_path:
+                local_path = download_dir
         else:
             from huggingface_hub import snapshot_download