"""透传到 pricebot 的共享 httpx.AsyncClient 单例。 为什么不能每请求新建(coupon.py / compare.py 老写法 async with httpx.AsyncClient(...)): ① 每次构造都重建一套 SSL 上下文(httpx.create_ssl_context 加载 certifi CA),实测 ~1s+/次;而 pricebot 是纯 http 透传,根本用不到 TLS → 纯浪费,且每帧重交一次。 ② trust_env 默认 True 会读进程 HTTP_PROXY,把 http://localhost:8000 这条本地透传整个 塞进本机代理(如 Clash 7897),恒定再多几秒。 单例:启动只建一次(SSL/连接池一次性),keep-alive 复用 TCP,每帧降到个位数 ms。 trust_env=False:对齐 integrations/meituan.py 的既有约定,不被进程代理误导,直连 pricebot。 """ from __future__ import annotations import httpx _client: httpx.AsyncClient | None = None def get_pricebot_client() -> httpx.AsyncClient: """取透传单例。lifespan 启动会预热;未预热(如测试态)懒建兜底。 超时不在此固化(coupon 30s / compare 60s 不同),由调用点 client.post(timeout=...) 传。 懒建无 await,asyncio 单线程下不会有并发竞态。 """ global _client if _client is None: _client = httpx.AsyncClient(trust_env=False) return _client async def aclose_pricebot_client() -> None: """lifespan 关停时调,优雅关连接池。""" global _client if _client is not None: await _client.aclose() _client = None