perf: 优化 HTTP 客户端连接池复用

- 新增 get_proxy_client() 方法,相同代理配置复用同一客户端
- 添加 LRU 淘汰策略,代理客户端上限 50 个防止内存泄漏
- 新增 get_default_client_async() 异步线程安全版本
- 使用模块级锁避免类属性初始化竞态条件
- 优化 ConcurrencyManager 使用 Redis MGET 批量获取减少往返
- 添加 get_pool_stats() 连接池统计信息接口
This commit is contained in:
fawney19
2026-01-08 13:34:59 +08:00
parent bf09e740e9
commit ea35efe440
4 changed files with 332 additions and 114 deletions

View File

@@ -85,6 +85,8 @@ class ConcurrencyManager:
"""
获取当前并发数
性能优化:使用 MGET 批量获取,减少 Redis 往返次数
Args:
endpoint_id: Endpoint ID可选
key_id: ProviderAPIKey ID可选
@@ -104,15 +106,21 @@ class ConcurrencyManager:
key_count = 0
try:
# 使用 MGET 批量获取,减少 Redis 往返2 次 GET -> 1 次 MGET
keys_to_fetch = []
if endpoint_id:
endpoint_key = self._get_endpoint_key(endpoint_id)
result = await self._redis.get(endpoint_key)
endpoint_count = int(result) if result else 0
keys_to_fetch.append(self._get_endpoint_key(endpoint_id))
if key_id:
key_key = self._get_key_key(key_id)
result = await self._redis.get(key_key)
key_count = int(result) if result else 0
keys_to_fetch.append(self._get_key_key(key_id))
if keys_to_fetch:
results = await self._redis.mget(keys_to_fetch)
idx = 0
if endpoint_id:
endpoint_count = int(results[idx]) if results[idx] else 0
idx += 1
if key_id:
key_count = int(results[idx]) if results[idx] else 0
except Exception as e:
logger.error(f"获取并发数失败: {e}")