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) # 处理请求错误