fix(proxy):修复代理池清理不可用代理时的并发问题
- 使用匿名函数和 defer 确保锁正确释放 - 避免在清理代理时出现并发访问冲突-保持代理池数据一致性
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user