b7b958ed58
coupon/compare 透传原先每请求 async with httpx.AsyncClient(...) 新建: 每次重建 SSL 上下文(加载 certifi CA)实测 ~1s+,而 pricebot 是纯 HTTP 透传根本用不到 TLS;且 trust_env 默认 True 会把 http://localhost:8000 经进程代理(Clash)再绕几秒。 抽 app/core/pricebot_client.py 共享单例:trust_env=False 直连,lifespan 启动预热(SSL 一次性成本付在启动)、关停 aclose;timeout 下放到 .post() 保留 coupon 30s / compare 60s 差异。keep-alive 复用 TCP,每帧降到个位数 ms。 --------- Co-authored-by: guke <guke@autohome.com.cn> Reviewed-on: #87 Co-authored-by: guke <guke@wonderable.ai> Co-committed-by: guke <guke@wonderable.ai>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""透传到 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
|