From b1d2125e223d6372c9ebae9eb2fe0db6491aa6a3 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 9 Sep 2024 08:55:10 +0800 Subject: [PATCH] =?UTF-8?q?fix=20https://github.com/jxxghp/MoviePilot/pull?= =?UTF-8?q?/2610=20=E6=95=B4=E5=90=88=E5=90=8C=E6=AD=A5=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=88=B0dev=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/command.py | 8 +++++--- app/core/event.py | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/app/command.py b/app/command.py index c3a606b3..6426046d 100644 --- a/app/command.py +++ b/app/command.py @@ -187,17 +187,20 @@ class Command(metaclass=Singleton): event, handlers = self.eventmanager.get_event() if event: logger.info(f"处理事件:{event.event_type} - {handlers}") + if not handlers and event.event_callback: + event.event_callback() for handler in handlers: names = handler.__qualname__.split(".") [class_name, method_name] = names try: if class_name in self.pluginmanager.get_plugin_ids(): # 插件事件 - self.threader.submit( + result = self.threader.submit( self.pluginmanager.run_plugin_method, class_name, method_name, copy.deepcopy(event) ) - + if event.event_callback: + event.event_callback(result) else: # 检查全局变量中是否存在 if class_name not in globals(): @@ -210,7 +213,6 @@ class Command(metaclass=Singleton): except Exception as e: logger.error(f"事件处理出错:{str(e)} - {traceback.format_exc()}") continue - else: # 通过类名创建类实例 class_obj = globals()[class_name]() diff --git a/app/core/event.py b/app/core/event.py index cd7abbcd..f3e79015 100644 --- a/app/core/event.py +++ b/app/core/event.py @@ -1,3 +1,5 @@ +import threading +import typing from queue import Queue, Empty from typing import Dict, Any @@ -76,17 +78,40 @@ class EventManager(metaclass=Singleton): self._disabled_handlers.remove(class_name) logger.debug(f"Event Enabled:{class_name}") - def send_event(self, etype: EventType, data: dict = None): + def send_event(self, etype: EventType, data: dict = None, callback: typing.Callable = None): """ - 发送事件 + 发送事件(异步响应) """ if etype not in EventType: return event = Event(etype.value) event.event_data = data or {} - logger.debug(f"发送事件:{etype.value} - {event.event_data}") + event.event_callback = callback + logger.debug(f"发送事件:{etype.value} - data:{event.event_data},callback:{callback}") self._eventQueue.put(event) + def send_event_sync(self, etype: EventType, data: dict = None): + """ + 发送事件(同步响应) + """ + result: any = None + condition = threading.Condition() + + def callback(res): + nonlocal result + if res: + result = res.result() + with condition: + condition.notify_all() + + thread = threading.Thread(target=self.send_event, args=(etype, data, callback)) + thread.start() + + with condition: + condition.wait() + + return result + def register(self, etype: [EventType, list]): """ 事件注册 @@ -117,6 +142,8 @@ class Event(object): self.event_type = event_type # 字典用于保存具体的事件数据 self.event_data = {} + # 事件完成后回调函数 + self.event_callback = None # 实例引用,用于注册事件