diff --git a/utils/markdown_to_image.py b/utils/markdown_to_image.py index e3b107b..5544a85 100644 --- a/utils/markdown_to_image.py +++ b/utils/markdown_to_image.py @@ -14,8 +14,7 @@ async def safe_close_browser(browser, timeout: float = 4.0) -> None: if not browser: return - # 1. 先尝试关闭所有 page(最重要) - for context in browser.contexts[:]: # 复制列表防止修改中迭代 + for context in browser.contexts[:]: for page in context.pages[:]: try: await asyncio.wait_for(page.close(), timeout=1.5) @@ -26,7 +25,6 @@ async def safe_close_browser(browser, timeout: float = 4.0) -> None: except: pass - # 2. 尝试优雅关闭 browser try: await asyncio.wait_for(browser.close(), timeout=timeout) logger.debug("browser closed gracefully") @@ -34,13 +32,10 @@ async def safe_close_browser(browser, timeout: float = 4.0) -> None: except (asyncio.TimeoutError, Exception) as e: logger.warning(f"browser.close failed: {e}") - # 3. 强制杀进程树(最关键一步) if browser.process and browser.process.pid: try: parent = psutil.Process(browser.process.pid) children = parent.children(recursive=True) - - # 3.1 try graceful terminate first for proc in children: try: proc.terminate() @@ -50,25 +45,19 @@ async def safe_close_browser(browser, timeout: float = 4.0) -> None: parent.terminate() except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass - - # 3.2 wait briefly, then force kill try: gone, alive = psutil.wait_procs([parent] + children, timeout=2) except Exception: gone, alive = [], [parent] + children - for proc in alive: try: proc.kill() except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass - - # 3.3 final wait and report try: gone, alive = psutil.wait_procs([parent] + children, timeout=3) except Exception: alive = [] - if alive: logger.warning(f"process still alive after kill: {[p.pid for p in alive]}") else: @@ -77,39 +66,188 @@ async def safe_close_browser(browser, timeout: float = 4.0) -> None: logger.warning(f"force kill failed: {e}") -# ================= 样式与 HTML 处理 ================= - async def md_str_to_html_content(md_content): - """ - 将 Markdown 字符串转换为 HTML 内容字符串(逻辑保持不变)。 - """ - # 转换 Markdown 为 HTML + """将 Markdown 字符串转换为更有风格的 HTML 内容。""" html_body = markdown.markdown(md_content, extensions=['extra', 'codehilite']) - # 保持你原有的 CSS 样式不变 css = """ """ @@ -120,25 +258,24 @@ async def md_str_to_html_content(md_content): {css}
- {html_body} +