perf: 优化向后兼容性

This commit is contained in:
Soulter
2024-12-14 22:26:08 +08:00
parent 69a4d6ac83
commit 990390218c
7 changed files with 25 additions and 6 deletions
+5 -1
View File
@@ -65,7 +65,11 @@ class AstrBotCoreLifecycle:
platform_tasks = self.load_platform()
event_bus_task = asyncio.create_task(self.event_bus.dispatch(), name="event_bus")
self.curr_tasks = [event_bus_task, *platform_tasks]
extra_tasks = []
for task in self.star_context._register_tasks:
extra_tasks.append(asyncio.create_task(task, name=task.__name__))
self.curr_tasks = [event_bus_task, *platform_tasks, *extra_tasks]
self.start_time = int(time.time())
async def start(self):
@@ -29,6 +29,7 @@ class StarRequestSubStage(Stage):
continue
star_cls_obj = star_map.get(handler.handler_module_str).star_cls
logger.debug(f"执行 Star Handler {handler.handler_full_name}")
# 判断 handler 是否是类方法(通过装饰器注册的没有 __self__ 属性)
ready_to_call = None
if hasattr(handler.handler, '__self__'):
@@ -39,9 +40,7 @@ class StarRequestSubStage(Stage):
# 向下兼容
ready_to_call = handler.handler(event, self.ctx.plugin_manager.context, **params)
else:
logger.debug("calling star handler: %s" % handler.handler_full_name)
ready_to_call = handler.handler(star_cls_obj, event, **params)
logger.debug("star handler %s called" % handler.handler_full_name)
if isinstance(ready_to_call, AsyncGenerator):
async for mer in ready_to_call:
@@ -59,13 +58,13 @@ class StarRequestSubStage(Stage):
if ret:
# 如果有返回值
assert isinstance(ret, (MessageEventResult, CommandResult)), "如果有返回值,必须是 MessageEventResult 或 CommandResult 类型。"
event.stop_event()
event.set_result(ret)
# 执行后续步骤来发送消息
if event.is_stopped() and event.get_result():
# 插件主动停止事件传播,并且有结果
event.continue_event()
yield
event.clear_result()
event.stop_event()
yield
elif not event.is_stopped and not event.get_result():
@@ -79,4 +78,5 @@ class StarRequestSubStage(Stage):
ret = f":(\n\n在调用插件 {star_map.get(handler.handler_module_str).name} 的处理函数 {handler.handler_name} 时出现异常:{e}"
event.set_result(MessageEventResult().message(ret))
yield
event.clear_result()
event.stop_event()
+2 -1
View File
@@ -40,4 +40,5 @@ class PipelineScheduler():
async def execute(self, event: AstrMessageEvent):
'''执行 pipeline'''
await self._process_stages(event)
await self._process_stages(event)
logger.debug("pipeline 执行完毕。")
@@ -47,6 +47,10 @@ class AstrMessageEvent(abc.ABC):
self._has_send_oper = False
'''是否有过至少一次发送操作'''
# back_compability
self.platform = platform_meta
def get_platform_name(self):
return self.platform_meta.name
@@ -2,7 +2,7 @@ import json
import os
from llmtuner.chat import ChatModel
from typing import List
from .. import ProviderMetaData, Provider
from .. import Provider
from astrbot.core.db import BaseDatabase
from astrbot import logger
+9
View File
@@ -35,6 +35,9 @@ class Context:
provider_manager: ProviderManager = None
platform_manager: PlatformManager = None
# back compatibility
_register_tasks: List[Awaitable] = []
def __init__(self, event_queue: Queue, config: AstrBotConfig, db: BaseDatabase):
self._event_queue = event_queue
@@ -198,3 +201,9 @@ class Context:
await platform.send_by_session(session, message_chain)
return True
return False
def register_task(self, task: Awaitable, desc: str):
'''
注册一个异步任务。
'''
self._register_tasks.append(task)
+1
View File
@@ -163,6 +163,7 @@ class PluginManager:
self._check_plugin_dept_update(target_plugin=root_dir_name)
module = __import__(path, fromlist=[module_str])
except Exception as e:
logger.error(traceback.format_exc())
logger.error(f"插件 {root_dir_name} 导入失败。原因:{str(e)}")
continue