From 8818d08dfa7b3e5427819984407bbd6640eccf9a Mon Sep 17 00:00:00 2001 From: lingyun14 Date: Tue, 5 May 2026 16:05:16 +0800 Subject: [PATCH 1/3] fix(t2i): run Shiki runtime injection in executor to avoid blocking event loop --- astrbot/core/utils/t2i/network_strategy.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/astrbot/core/utils/t2i/network_strategy.py b/astrbot/core/utils/t2i/network_strategy.py index 4fec121953..cf4c31df5f 100644 --- a/astrbot/core/utils/t2i/network_strategy.py +++ b/astrbot/core/utils/t2i/network_strategy.py @@ -156,9 +156,12 @@ async def render_custom_template( if options: default_options |= options - if SHIKI_RUNTIME_TEMPLATE_PATTERN.search(tmpl_str): - tmpl_data = {"shiki_runtime": get_shiki_runtime()} | tmpl_data - tmpl_str = inject_shiki_runtime(tmpl_str) + # 在线程池中执行 Shiki 注入,避免 1.2MB JS 处理阻塞事件循环 + import asyncio + loop = asyncio.get_event_loop() + tmpl_str, tmpl_data = await loop.run_in_executor( + None, self._prepare_template_sync, tmpl_str, tmpl_data + ) post_data = { "tmpl": tmpl_str, "json": return_url, @@ -219,3 +222,12 @@ async def render( }, return_url, ) + + def _prepare_template_sync( + self, tmpl_str: str, tmpl_data: dict + ) -> tuple[str, dict]: + """在线程池中执行的同步模板预处理(避免阻塞事件循环)""" + if SHIKI_RUNTIME_TEMPLATE_PATTERN.search(tmpl_str): + tmpl_data = {"shiki_runtime": get_shiki_runtime()} | tmpl_data + tmpl_str = inject_shiki_runtime(tmpl_str) + return tmpl_str, tmpl_data From 11c0c3679d91ed6c4e6c6ed04c9f129bc6aa33aa Mon Sep 17 00:00:00 2001 From: lingyun14 Date: Tue, 5 May 2026 16:25:08 +0800 Subject: [PATCH 2/3] Update network_strategy.py --- astrbot/core/utils/t2i/network_strategy.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/astrbot/core/utils/t2i/network_strategy.py b/astrbot/core/utils/t2i/network_strategy.py index cf4c31df5f..a8d6c57380 100644 --- a/astrbot/core/utils/t2i/network_strategy.py +++ b/astrbot/core/utils/t2i/network_strategy.py @@ -157,8 +157,7 @@ async def render_custom_template( default_options |= options # 在线程池中执行 Shiki 注入,避免 1.2MB JS 处理阻塞事件循环 - import asyncio - loop = asyncio.get_event_loop() + loop = asyncio.get_running_loop() tmpl_str, tmpl_data = await loop.run_in_executor( None, self._prepare_template_sync, tmpl_str, tmpl_data ) @@ -223,8 +222,9 @@ async def render( return_url, ) + @staticmethod def _prepare_template_sync( - self, tmpl_str: str, tmpl_data: dict + tmpl_str: str, tmpl_data: dict ) -> tuple[str, dict]: """在线程池中执行的同步模板预处理(避免阻塞事件循环)""" if SHIKI_RUNTIME_TEMPLATE_PATTERN.search(tmpl_str): From e352dc1447fd957fd1a42bdf6a01a2890b4dde41 Mon Sep 17 00:00:00 2001 From: lingyun14 Date: Tue, 5 May 2026 16:27:39 +0800 Subject: [PATCH 3/3] ruff --- astrbot/core/utils/t2i/network_strategy.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/astrbot/core/utils/t2i/network_strategy.py b/astrbot/core/utils/t2i/network_strategy.py index a8d6c57380..1191e154a9 100644 --- a/astrbot/core/utils/t2i/network_strategy.py +++ b/astrbot/core/utils/t2i/network_strategy.py @@ -223,9 +223,7 @@ async def render( ) @staticmethod - def _prepare_template_sync( - tmpl_str: str, tmpl_data: dict - ) -> tuple[str, dict]: + def _prepare_template_sync(tmpl_str: str, tmpl_data: dict) -> tuple[str, dict]: """在线程池中执行的同步模板预处理(避免阻塞事件循环)""" if SHIKI_RUNTIME_TEMPLATE_PATTERN.search(tmpl_str): tmpl_data = {"shiki_runtime": get_shiki_runtime()} | tmpl_data