From abbd2253ad6ab0089cc6816b867e5ea8d9ed3fa8 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 21 Jan 2026 22:46:04 +0800 Subject: [PATCH] fix deadlock --- app/chain/transfer.py | 71 +++++++++++++++++-------------------------- 1 file changed, 28 insertions(+), 43 deletions(-) diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 2e24645c..789e4026 100755 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -221,9 +221,8 @@ class JobManager: """ 移除作业 """ - __mediaid__ = self.__get_media_id(media=task.mediainfo, season=task.meta.begin_season) with job_lock: - # 移除作业 + __mediaid__ = self.__get_media_id(media=task.mediainfo, season=task.meta.begin_season) if __mediaid__ in self._job_view: # 移除季集信息 if __mediaid__ in self._season_episodes: @@ -320,55 +319,48 @@ class JobManager: 获取某项任务成功的任务 """ __mediaid__ = self.__get_media_id(media=media, season=season) - with job_lock: - if __mediaid__ not in self._job_view: - return [] - return [task for task in self._job_view[__mediaid__].tasks if task.state == "completed"] + if __mediaid__ not in self._job_view: + return [] + return [task for task in self._job_view[__mediaid__].tasks if task.state == "completed"] def all_tasks(self, media: MediaInfo, season: Optional[int] = None) -> List[TransferJobTask]: """ 获取全部任务 """ __mediaid__ = self.__get_media_id(media=media, season=season) - with job_lock: - if __mediaid__ not in self._job_view: - return [] - return self._job_view[__mediaid__].tasks + if __mediaid__ not in self._job_view: + return [] + return self._job_view[__mediaid__].tasks def count(self, media: MediaInfo, season: Optional[int] = None) -> int: """ 获取某项任务成功总数 """ __mediaid__ = self.__get_media_id(media=media, season=season) - with job_lock: - # 计算状态为完成的任务数 - if __mediaid__ not in self._job_view: - return 0 - return len([task for task in self._job_view[__mediaid__].tasks if task.state == "completed"]) + if __mediaid__ not in self._job_view: + return 0 + return len([task for task in self._job_view[__mediaid__].tasks if task.state == "completed"]) def size(self, media: MediaInfo, season: Optional[int] = None) -> int: """ 获取某项任务成功文件总大小 """ __mediaid__ = self.__get_media_id(media=media, season=season) - with job_lock: - # 计算状态为完成的任务数 - if __mediaid__ not in self._job_view: - return 0 - return sum([ - task.fileitem.size if task.fileitem.size is not None - else ( - SystemUtils.get_directory_size(Path(task.fileitem.path)) if task.fileitem.storage == "local" else 0) - for task in self._job_view[__mediaid__].tasks - if task.state == "completed" - ]) + if __mediaid__ not in self._job_view: + return 0 + return sum([ + task.fileitem.size if task.fileitem.size is not None + else ( + SystemUtils.get_directory_size(Path(task.fileitem.path)) if task.fileitem.storage == "local" else 0) + for task in self._job_view[__mediaid__].tasks + if task.state == "completed" + ]) def total(self) -> int: """ 获取所有task任务总数 """ - with job_lock: - return sum([len(job.tasks) for job in self._job_view.values()]) + return sum([len(job.tasks) for job in self._job_view.values()]) def list_jobs(self) -> List[TransferJob]: """ @@ -381,8 +373,7 @@ class JobManager: 获取季集清单 """ __mediaid__ = self.__get_media_id(media=media, season=season) - with job_lock: - return self._season_episodes.get(__mediaid__) or [] + return self._season_episodes.get(__mediaid__) or [] class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): @@ -527,8 +518,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): }) # 移除已完成的任务 - with job_lock: - self.jobview.remove_job(task) + self.jobview.remove_job(task) transferhis = TransferHistoryOper() if not transferinfo.success: @@ -568,8 +558,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): )) # 整理失败 - with job_lock: - self.jobview.fail_task(task) + self.jobview.fail_task(task) # 全部整理完成且有成功的任务时 if self.jobview.is_finished(task): @@ -579,8 +568,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): return False, transferinfo.message # task转移成功 - with job_lock: - self.jobview.finish_task(task) + self.jobview.finish_task(task) logger.info(f"{task.fileitem.name} 入库成功:{transferinfo.target_diritem.path}") @@ -666,8 +654,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): """ 添加到作业视图 """ - with job_lock: - self.jobview.add_task(task) + self.jobview.add_task(task) def remove_from_queue(self, fileitem: FileItem): """ @@ -675,8 +662,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): """ if not fileitem: return - with job_lock: - self.jobview.remove_task(fileitem) + self.jobview.remove_task(fileitem) def __start_transfer(self): """ @@ -919,9 +905,8 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton): finally: # 移除已完成的任务 - with job_lock: - if self.jobview.is_done(task): - self.jobview.remove_job(task) + if self.jobview.is_done(task): + self.jobview.remove_job(task) def get_queue_tasks(self) -> List[TransferJob]: """