feat: render pipeline optimization (Phase 0) #94

Merged
cal merged 2 commits from feature/render-pipeline-optimization into main 2026-03-16 16:15:42 +00:00
2 changed files with 19 additions and 33 deletions
Showing only changes of commit 6ab50ba5f2 - Show all commits

View File

@ -9,6 +9,8 @@ from typing import Optional, List, Literal
import logging
import pydantic
from pandas import DataFrame
import asyncio as _asyncio
from playwright.async_api import async_playwright, Browser, Playwright
from ..card_creation import get_batter_card_data, get_pitcher_card_data
@ -37,6 +39,7 @@ from ..dependencies import oauth2_scheme, valid_token
_browser: Browser | None = None
_playwright: Playwright | None = None
_browser_lock = _asyncio.Lock()
async def get_browser() -> Browser:
@ -45,18 +48,22 @@ async def get_browser() -> Browser:
Reuses a single browser across all card renders, eliminating the ~1-1.5s
per-request launch/teardown overhead. Automatically reconnects if the
browser process has died.
Uses an asyncio.Lock to prevent concurrent requests from racing to
launch multiple Chromium processes.
"""
global _browser, _playwright
if _browser is None or not _browser.is_connected():
if _playwright is not None:
try:
await _playwright.stop()
except Exception:
pass
_playwright = await async_playwright().start()
_browser = await _playwright.chromium.launch(
args=["--no-sandbox", "--disable-dev-shm-usage"]
)
async with _browser_lock:
if _browser is None or not _browser.is_connected():
if _playwright is not None:
try:
await _playwright.stop()
except Exception:
pass
_playwright = await async_playwright().start()
_browser = await _playwright.chromium.launch(
args=["--no-sandbox", "--disable-dev-shm-usage"]
)
return _browser

File diff suppressed because one or more lines are too long