修复转图浏览器预热跨事件循环失效问题
变更项:\n1. 新增 async_job 启动钩子能力 add_startup_job,在调度器事件循环中执行一次性初始化任务。\n2. 将 main.py 的 Markdown 转图预热从独立线程改为调度器 loop 内执行,确保预热实例可被后续任务复用。\n3. 增强 markdown_to_image 常驻浏览器管理:记录 owner loop、检测跨 loop 复用并自动重建。\n4. 补充预热与常驻浏览器日志,输出 loop 标识和浏览器 PID,便于线上排查进程状态。\n5. 保持现有转图超时与重试逻辑不变,仅修复预热生效链路与可观测性。
This commit is contained in:
16
main.py
16
main.py
@@ -5,7 +5,7 @@ import threading
|
||||
|
||||
from admin.GlancesMonitor import GlancesMonitor
|
||||
from utils.decorator.async_job import async_job
|
||||
from utils.markdown_to_image import warmup_md2img_browser_sync
|
||||
from utils.markdown_to_image import warmup_md2img_browser
|
||||
from configuration import Config
|
||||
from robot import Robot
|
||||
|
||||
@@ -107,19 +107,19 @@ def main():
|
||||
except Exception as e:
|
||||
robot.LOG.error(f"GlancesMonitor服务器启动失败: {e}")
|
||||
|
||||
# 启动后异步预热 Markdown 转图浏览器,降低首个转图任务冷启动失败概率。
|
||||
# 启动后在“调度器同一事件循环”中预热 Markdown 转图浏览器。
|
||||
# 这样可确保预热得到的常驻浏览器与后续截图任务复用同一 loop,避免跨 loop 句柄失效。
|
||||
try:
|
||||
def _warmup_md2img():
|
||||
ok = warmup_md2img_browser_sync(timeout_seconds=60)
|
||||
async def _warmup_md2img():
|
||||
ok = await warmup_md2img_browser(timeout_seconds=60)
|
||||
if ok:
|
||||
robot.LOG.info("Markdown 转图浏览器预热成功")
|
||||
robot.LOG.info("Markdown 转图浏览器预热成功(调度器事件循环)")
|
||||
else:
|
||||
robot.LOG.warning("Markdown 转图浏览器预热失败,运行期将按需重试")
|
||||
|
||||
warmup_thread = threading.Thread(target=_warmup_md2img, daemon=True)
|
||||
warmup_thread.start()
|
||||
async_job.add_startup_job(_warmup_md2img, name="md2img_warmup")
|
||||
except Exception as e:
|
||||
robot.LOG.error(f"启动 Markdown 转图预热线程失败: {e}")
|
||||
robot.LOG.error(f"注册 Markdown 转图预热任务失败: {e}")
|
||||
|
||||
robot.LOG.info(f"=" * 50)
|
||||
asyncio.run(async_job.run_all())
|
||||
|
||||
Reference in New Issue
Block a user