Merge pull request #4548 from cddjr/set_lock_timeout

This commit is contained in:
jxxghp
2025-07-07 12:04:46 +08:00
committed by GitHub
3 changed files with 35 additions and 10 deletions

View File

@@ -39,6 +39,8 @@ class SubscribeChain(ChainBase):
""" """
_rlock = threading.RLock() _rlock = threading.RLock()
# 避免莫名原因导致长时间持有锁
_LOCK_TIMOUT = 3600 * 2
def add(self, title: str, year: str, def add(self, title: str, year: str,
mtype: MediaType = None, mtype: MediaType = None,
@@ -279,8 +281,15 @@ class SubscribeChain(ChainBase):
:param manual: 是否手动搜索 :param manual: 是否手动搜索
:return: 更新订阅状态为R或删除订阅 :return: 更新订阅状态为R或删除订阅
""" """
with self._rlock: lock_acquired = False
logger.debug(f"search lock acquired at {datetime.now()}") 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() subscribeoper = SubscribeOper()
if sid: if sid:
subscribe = subscribeoper.get(sid) subscribe = subscribeoper.get(sid)
@@ -437,8 +446,10 @@ class SubscribeChain(ChainBase):
finally: finally:
subscribes.clear() subscribes.clear()
del subscribes del subscribes
finally:
logger.debug(f"search Lock released at {datetime.now()}") if lock_acquired:
self._rlock.release()
logger.debug(f"search Lock released at {datetime.now()}")
# 如果不是大内存模式,进行垃圾回收 # 如果不是大内存模式,进行垃圾回收
if not settings.BIG_MEMORY_MODE: if not settings.BIG_MEMORY_MODE:
@@ -565,8 +576,14 @@ class SubscribeChain(ChainBase):
logger.warn('没有缓存资源,无法匹配订阅') logger.warn('没有缓存资源,无法匹配订阅')
return return
with self._rlock: lock_acquired = False
logger.debug(f"match lock acquired at {datetime.now()}") 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]] = {} processed_torrents: Dict[str, List[Context]] = {}
@@ -822,8 +839,10 @@ class SubscribeChain(ChainBase):
del processed_torrents del processed_torrents
subscribes.clear() subscribes.clear()
del subscribes del subscribes
finally:
logger.debug(f"match Lock released at {datetime.now()}") if lock_acquired:
self._rlock.release()
logger.debug(f"match Lock released at {datetime.now()}")
def check(self): def check(self):
""" """

View File

@@ -562,9 +562,12 @@ class FileManagerModule(_ModuleBase):
if not settings.LOCAL_EXISTS_SEARCH: if not settings.LOCAL_EXISTS_SEARCH:
return None return None
logger.debug(f"正在本地媒体库中查找 {mediainfo.title_year}...")
# 检查媒体库 # 检查媒体库
fileitems = self.media_files(mediainfo) fileitems = self.media_files(mediainfo)
if not fileitems: if not fileitems:
logger.debug(f"{mediainfo.title_year} 不在本地媒体库中")
return None return None
if mediainfo.type == MediaType.MOVIE: if mediainfo.type == MediaType.MOVIE:

View File

@@ -219,8 +219,11 @@ class U115Pan(StorageBase, metaclass=Singleton):
# 处理速率限制 # 处理速率限制
if resp.status_code == 429: if resp.status_code == 429:
reset_time = int(resp.headers.get("X-RateLimit-Reset", 60)) reset_time = 5 + int(resp.headers.get("X-RateLimit-Reset", 60))
time.sleep(reset_time + 5) logger.debug(
f"【115】{method} 请求 {endpoint} 限流,等待{reset_time}秒后重试"
)
time.sleep(reset_time)
return self._request_api(method, endpoint, result_key, **kwargs) return self._request_api(method, endpoint, result_key, **kwargs)
# 处理请求错误 # 处理请求错误