答案:使用信号量控制并发、复用http.Client、设置超时重试、通过channel收集结果,避免资源耗尽。具体包括:1. 用semaphore.NewWeighted(n)限制最大并发数;2. 全局复用client并调优Transport参数;3. 每个请求绑定context实现超时控制;4. 对5xx等临时错误进行指数退避重试;5. 使用worker goroutine从任务channel取URL,处理后将结果发送至结果channel;6. 主协程关闭任务channel后读取结果并输出,需保序时可携带索引排序。

用 Go 批量发 HTTP 请求,核心是控制并发、避免压垮服务端或耗尽本地资源。不靠盲目开 goroutine,而要结合限流、超时、重试和连接复用。
直接启动成百上千 goroutine 容易触发系统级限制(如文件描述符耗尽)或被目标服务限流/拉黑。推荐用信号量(如 golang.org/x/sync/semaphore)限制同时活跃的请求数:
sem := semaphore.NewWeighted(10) 表示最多 10 个并发sem.Acquire(ctx, 1),成功才发起请求;结束后调用 sem.Release(1)
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
每次 new http.Client 都会创建独立的 Transport,浪费资源。正确做法是全局复用一个 client,并调优其 Transport:
MaxIdleConns 和 MaxIdleConnsPerHost(建议设为 100 或更高),避免频繁建连KeepAlive(默认开启),并适当调大 IdleConnTimeout(如 90s)DisableCompression: true),尤其响应体小且不敏感时批量请求中个别失败不可避免,需策略性应对:
立即学习“go语言免费学习笔记(深入)”;
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
别用共享 map + mutex 收集结果,容易出错。推荐 channel + sync.WaitGroup 模式:
基本上就这些。Golang 的并发模型天然适合批量 HTTP 场景,关键在“控”不在“猛”。合理设限、复用资源、分类容错,比堆 goroutine 更稳更快。
以上就是如何使用Golang批量处理HTTP请求_Golang HTTP并发策略与优化的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号