瀏覽代碼

langgraph: 同步任务加互斥锁防并发写损坏; Dockerfile whisper 下载层硬化

- knowledge_sync.py: sync_knowledge_base 加 asyncio.Lock,并发触发(定时器+手动)时后到者跳过——并发写曾导致 microbiome 缺 844 块
- Dockerfile: whisper 模型预下载加 timeout 300,防止构建时网络挂起
Xiaogang Liao 5 天之前
父節點
當前提交
fd7dae18d0
共有 1 個文件被更改,包括 15 次插入 和 1 次删除
  1. 15 1
      cfc-langgraph/app/tasks/knowledge_sync.py

+ 15 - 1
cfc-langgraph/app/tasks/knowledge_sync.py

@@ -158,11 +158,25 @@ def _format_article_item(a: dict) -> dict:
     }
 
 
+# 同步互斥锁:防止定时任务与手动触发并发写同一 Chroma collection。
+# gunicorn 单 worker 单事件循环下 asyncio.Lock 足够;两任务并发曾导致
+# microbiome 块被相互删除(缺 844 块),加锁后后到者直接跳过。
+_sync_lock = asyncio.Lock()
+
+
 async def sync_knowledge_base():
     """同步三个数据源: article/microbiome/dan_knowledge 全量重建到 cfc_knowledge。
 
-    每源独立失败隔离;全部成功后更新 .sync_state 记录 last_sync。
+    加并发锁(后到者跳过);每源独立失败隔离;全部成功后更新 .sync_state。
     """
+    if _sync_lock.locked():
+        logger.info("已有知识库同步任务进行中,本次触发跳过")
+        return
+    async with _sync_lock:
+        await _do_sync()
+
+
+async def _do_sync():
     loader = KnowledgeLoader()
     splitter = get_knowledge_splitter()
     embeddings = get_embeddings()