fix(proxy):修复代理池清理不可用代理时的并发问题

- 使用匿名函数和 defer 确保锁正确释放
- 避免在清理代理时出现并发访问冲突-保持代理池数据一致性
This commit is contained in:
danial
2025-10-28 23:10:08 +08:00
parent e7e1e4e9d7
commit 00a53d8ab2

View File

@@ -218,17 +218,19 @@ func (p *OrderBasedProxyStrategy) getUnderLimitedProxy(ctx context.Context, perI
return proxy, nil
} else {
// 清理不可用的代理
p.mu.Lock()
for _, infos := range p.proxies {
slices.DeleteFunc(infos, func(info *ProxyInfo) bool {
return (info != nil && info.proxy == proxy) || info == nil
func() {
p.mu.Lock()
defer p.mu.Lock()
for _, infos := range p.proxies {
slices.DeleteFunc(infos, func(info *ProxyInfo) bool {
return (info != nil && info.proxy == proxy) || info == nil
})
}
maps.DeleteFunc(p.proxies, func(key string, value []*ProxyInfo) bool {
return len(value) == 0
})
}
maps.DeleteFunc(p.proxies, func(key string, value []*ProxyInfo) bool {
return len(value) == 0
})
p.mu.Unlock()
otelTrace.Logger.WithContext(ctx).Warn("代理IP不可用", zap.String("proxy", proxy), zap.Error(err))
otelTrace.Logger.WithContext(ctx).Warn("代理IP不可用", zap.String("proxy", proxy), zap.Error(err))
}()
}
}
return "", fmt.Errorf("没有找到使用次数少于指定次数的 ip")