总结优化

This commit is contained in:
liuwei
2026-03-11 11:32:27 +08:00
parent 4555f9eb69
commit cfabd169fb

View File

@@ -2,42 +2,54 @@ import subprocess
import time import time
import markdown import markdown
from pathlib import Path from pathlib import Path
import psutil
from playwright.async_api import async_playwright from playwright.async_api import async_playwright
import os import os
import asyncio import asyncio
from loguru import logger from loguru import logger
async def safe_close_browser(browser, timeout: float = 5.0) -> None: async def safe_close_browser(browser, timeout: float = 4.0) -> None:
if not browser: if not browser:
return return
# Close contexts first to reduce hanging risk. # 1. 先尝试关闭所有 page最重要
for context in browser.contexts[:]: # 复制列表防止修改中迭代
for page in context.pages[:]:
try: try:
for ctx in browser.contexts: await asyncio.wait_for(page.close(), timeout=1.5)
try: except:
await asyncio.wait_for(ctx.close(), timeout=timeout)
except Exception:
pass pass
except Exception: try:
await asyncio.wait_for(context.close(), timeout=timeout)
except:
pass pass
# Then close browser with timeout. # 2. 尝试优雅关闭 browser
try: try:
await asyncio.wait_for(browser.close(), timeout=timeout) await asyncio.wait_for(browser.close(), timeout=timeout)
logger.debug("browser closed gracefully")
return return
except asyncio.TimeoutError: except (asyncio.TimeoutError, Exception) as e:
logger.warning("Browser close timed out, killing process") logger.warning(f"browser.close failed: {e}")
except Exception as e:
logger.warning(f"Browser close failed, killing process: {e}")
# Final fallback: kill underlying process. # 3. 强制杀进程树(最关键一步)
if browser.process and browser.process.pid:
try: try:
proc = browser.process parent = psutil.Process(browser.process.pid)
if proc: children = parent.children(recursive=True)
proc.kill() for child in children:
except Exception: try:
child.kill()
except psutil.NoSuchProcess:
pass pass
parent.kill()
# 可选:等待一小会儿确认退出
psutil.wait_procs([parent] + children, timeout=3)
logger.debug("process tree killed")
except (psutil.NoSuchProcess, Exception) as e:
logger.warning(f"force kill failed: {e}")
# ================= 样式与 HTML 处理 ================= # ================= 样式与 HTML 处理 =================