信息发布→ 登录 注册 退出

如何使用Golang批量处理HTTP请求_Golang HTTP并发策略与优化

发布时间:2025-12-03

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

如何使用golang批量处理http请求_golang http并发策略与优化

用 Go 批量发 HTTP 请求,核心是控制并发、避免压垮服务端或耗尽本地资源。不靠盲目开 goroutine,而要结合限流、超时、重试和连接复用。

semaphore 控制并发数

直接启动成百上千 goroutine 容易触发系统级限制(如文件描述符耗尽)或被目标服务限流/拉黑。推荐用信号量(如 golang.org/x/sync/semaphore)限制同时活跃的请求数:

  • 初始化一个带容量的信号量,比如 sem := semaphore.NewWeighted(10) 表示最多 10 个并发
  • 每个请求前调用 sem.Acquire(ctx, 1),成功才发起请求;结束后调用 sem.Release(1)
  • 配合 context 可实现整体超时或取消,比如 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)

复用 http.Client 和连接池

每次 new http.Client 都会创建独立的 Transport,浪费资源。正确做法是全局复用一个 client,并调优其 Transport:

  • 设置 MaxIdleConnsMaxIdleConnsPerHost(建议设为 100 或更高),避免频繁建连
  • 启用 KeepAlive(默认开启),并适当调大 IdleConnTimeout(如 90s)
  • 禁用压缩可省 CPU(DisableCompression: true),尤其响应体小且不敏感时

统一处理超时、重试与错误

批量请求中个别失败不可避免,需策略性应对:

独响 独响

一个轻笔记+角色扮演的app

独响 249 查看详情 独响
  • 每个 request 必须绑定 context,例如 req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
  • 对临时性错误(如 502/503、net.ErrTimeout、context.DeadlineExceeded)做有限重试(如 2 次),用指数退避
  • 区分错误类型:DNS 失败、连接拒绝、TLS 握手失败等一般不重试;4xx 错误通常不重试;5xx 可酌情重试

结果收集与结构化输出

别用共享 map + mutex 收集结果,容易出错。推荐 channel + sync.WaitGroup 模式:

  • 启动固定数量 worker goroutine,从任务 channel 拿 URL,处理完把结果(含 url、status、body、err)发到结果 channel
  • 主 goroutine 关闭任务 channel 后,用 for-range 读取结果 channel,按需聚合或写入文件
  • 若需保序,可在请求时带上索引号,结果结构体里存 index,最后按 index 排序输出

基本上就这些。Golang 的并发模型天然适合批量 HTTP 场景,关键在“控”不在“猛”。合理设限、复用资源、分类容错,比堆 goroutine 更稳更快。

以上就是如何使用Golang批量处理HTTP请求_Golang HTTP并发策略与优化的详细内容,更多请关注其它相关文章!


相关文章: 如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  抖音从哪里进入网页版_抖音官方入口链接  曝R星经典之作开发图 设计简陋但信息密集!  苹果手机如何防止被恶意App追踪  Lar*el Eloquent:基于关联关系是否存在进行父模型过滤与删除  在python-socketio事件处理器中安全访问Flask应用上下文  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  如何让 composer 信任自签名的 HTTPS 证书源?  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  在命令行怎么运行html项目_命令行运行html项目方法【教程】  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  2026年CSGO开箱网站推荐 CSGO开箱平台精选  如何在Python中使用Optional类型处理可变对象并避免Pylint警告  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  j*a toString()的覆盖  J*aScript DOM操作:高效清空列表元素的策略与实践  ArchiveofOurOwn小说阅读-ArchiveofOurOwn同人作品访问链接  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  在Socket.IO连接中实现Access Token自动更新与动态重连  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  Lar*el Form Request中唯一性验证在更新操作中的正确实现  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  知音漫客官网漫画下载_知音漫客网页版阅读记录  jQuery Mask 插件中实现电话号码固定前导零的教程  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  解决移动端滚动问题的overflow属性应用指南  Tabulator表格日期时间排序问题及自定义解决方案  微信群消息显示延迟如何解决 微信群消息刷新优化方法  composer的"require-dev"部分是用来做什么的?  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  最新韩小圈网页版登录入口_官网在线观看官方链接  CSS实现侧边栏导航项全宽圆角悬停背景效果  python3时间如何用calendar输出?  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  AO3访问入口汇总 AO3网页版同人作品一键直达  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!