From 2ed13c7e5b41344cf0e6bc247d80908150b35fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=AF=E5=A4=A7=E4=BE=A0?= Date: Mon, 7 Jul 2025 11:33:05 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E8=AE=A2=E9=98=85=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E9=94=81=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E7=BD=95=E8=A7=81=E7=9A=84=E9=95=BF=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=8D=A1=E4=BB=BB=E5=8A=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/chain/subscribe.py | 35 ++++++++++++++++++------ app/modules/filemanager/__init__.py | 3 ++ app/modules/filemanager/storages/u115.py | 7 +++-- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index 452ed8fa..9001ca6e 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -39,6 +39,8 @@ class SubscribeChain(ChainBase): """ _rlock = threading.RLock() + # 避免莫名原因导致长时间持有锁 + _LOCK_TIMOUT = 3600 * 2 def add(self, title: str, year: str, mtype: MediaType = None, @@ -279,8 +281,15 @@ class SubscribeChain(ChainBase): :param manual: 是否手动搜索 :return: 更新订阅状态为R或删除订阅 """ - with self._rlock: - logger.debug(f"search lock acquired at {datetime.now()}") + lock_acquired = False + try: + if lock_acquired := self._rlock.acquire( + blocking=True, timeout=self._LOCK_TIMOUT + ): + logger.debug(f"search lock acquired at {datetime.now()}") + else: + logger.warn("search上锁超时") + subscribeoper = SubscribeOper() if sid: subscribe = subscribeoper.get(sid) @@ -437,8 +446,10 @@ class SubscribeChain(ChainBase): finally: subscribes.clear() del subscribes - - logger.debug(f"search Lock released at {datetime.now()}") + finally: + if lock_acquired: + self._rlock.release() + logger.debug(f"search Lock released at {datetime.now()}") # 如果不是大内存模式,进行垃圾回收 if not settings.BIG_MEMORY_MODE: @@ -565,8 +576,14 @@ class SubscribeChain(ChainBase): logger.warn('没有缓存资源,无法匹配订阅') return - with self._rlock: - logger.debug(f"match lock acquired at {datetime.now()}") + lock_acquired = False + try: + if lock_acquired := self._rlock.acquire( + blocking=True, timeout=self._LOCK_TIMOUT + ): + logger.debug(f"match lock acquired at {datetime.now()}") + else: + logger.warn("match上锁超时") # 预识别所有未识别的种子 processed_torrents: Dict[str, List[Context]] = {} @@ -822,8 +839,10 @@ class SubscribeChain(ChainBase): del processed_torrents subscribes.clear() del subscribes - - logger.debug(f"match Lock released at {datetime.now()}") + finally: + if lock_acquired: + self._rlock.release() + logger.debug(f"match Lock released at {datetime.now()}") def check(self): """ diff --git a/app/modules/filemanager/__init__.py b/app/modules/filemanager/__init__.py index 5e65cd88..9406ed3b 100644 --- a/app/modules/filemanager/__init__.py +++ b/app/modules/filemanager/__init__.py @@ -562,9 +562,12 @@ class FileManagerModule(_ModuleBase): if not settings.LOCAL_EXISTS_SEARCH: return None + logger.debug(f"正在本地媒体库中查找 {mediainfo.title_year}...") + # 检查媒体库 fileitems = self.media_files(mediainfo) if not fileitems: + logger.debug(f"{mediainfo.title_year} 不在本地媒体库中") return None if mediainfo.type == MediaType.MOVIE: diff --git a/app/modules/filemanager/storages/u115.py b/app/modules/filemanager/storages/u115.py index c85ec425..ced7e8df 100644 --- a/app/modules/filemanager/storages/u115.py +++ b/app/modules/filemanager/storages/u115.py @@ -219,8 +219,11 @@ class U115Pan(StorageBase, metaclass=Singleton): # 处理速率限制 if resp.status_code == 429: - reset_time = int(resp.headers.get("X-RateLimit-Reset", 60)) - time.sleep(reset_time + 5) + reset_time = 5 + int(resp.headers.get("X-RateLimit-Reset", 60)) + logger.debug( + f"【115】{method} 请求 {endpoint} 限流,等待{reset_time}秒后重试" + ) + time.sleep(reset_time) return self._request_api(method, endpoint, result_key, **kwargs) # 处理请求错误