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

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):

View File

@@ -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()

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 执行完毕。")

View File

@@ -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

View File

@@ -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

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)

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