0

0

如何使用Golang并发下载文件_协程分块请求加快速度

P粉602998670

P粉602998670

发布时间:2026-01-07 17:09:10

|

524人浏览过

|

来源于php中文网

原创

Go并发下载文件需先HEAD确认服务器支持Range请求,再按Content-Length合理分块(如4块/100MB),各goroutine用独立Range请求写入文件指定偏移,最后校验总大小与哈希值。

如何使用golang并发下载文件_协程分块请求加快速度

用 Go 语言实现并发下载文件,核心是把一个大文件按字节范围分块,再用多个 goroutine 并发请求各块,最后合并。关键不是“开很多协程”,而是合理分块、处理 HTTP Range 请求、避免竞争和资源耗尽。

1. 确认服务器支持 Range 请求

不是所有服务器都允许分块下载。先发一个 HEAD 请求,检查响应头是否包含 Accept-Ranges: bytesContent-Range 字段:

  • http.Head(url) 获取响应头
  • resp.Header.Get("Accept-Ranges") == "bytes",说明支持
  • 若不支持,只能单连接下载,强行分块会返回 200 + 全体内容,造成重复和错乱

2. 获取文件总大小并计算分块策略

用 HEAD 请求拿到 Content-Length,再按需切分。例如 100MB 文件,开 4 个 goroutine,每块约 25MB:

  • 块数不宜过多(如超过 16),否则 TCP 连接、DNS、系统 fd 数可能成为瓶颈
  • 每块建议 ≥ 1MB,太小会增加 HTTP 开销;≤ 50MB,避免单 goroutine 内存压力过大
  • 计算每个块的 startend(注意 end 是闭区间,HTTP Range 是 inclusive)

3. 并发发起 Range 请求并写入临时文件

每个 goroutine 独立发起 GET 请求,设置 Range: bytes=start-end 头,并将响应 Body 写入文件指定偏移位置:

OpenJobs AI
OpenJobs AI

AI驱动的职位搜索推荐平台

下载

立即学习go语言免费学习笔记(深入)”;

  • os.OpenFile(..., os.O_CREATE|os.O_RDWR) 打开文件,**不要用 O_TRUNC**
  • 每个 goroutine 创建独立的 *os.File 或共享 file + file.WriteAt()(线程安全)
  • 务必设置超时:http.Client{Timeout: 30 * time.Second}
  • 捕获错误(如 416、网络中断),记录失败块,支持重试(最多 2 次)

4. 合并与校验(可选但推荐)

所有块写完后,无需“合并”操作——因为已按偏移写入同一文件。只需做两件事:

  • 检查文件大小是否等于预期 Content-Length,不等说明某块写漏或截断
  • 可选:计算最终文件的 SHA256,对比服务端提供的 ETag 或单独提供的 checksum
  • 若出错,只重下失败块,不用重下全部

注意:别用 ioutil.ReadAll + 内存拼接,大文件会 OOM;别用 channel 收集所有数据再写盘,失去流式优势;别在 goroutine 里用同一个 http.Client 不加限制,应复用 Transport 并设 MaxIdleConns。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

java学习网站推荐汇总
java学习网站推荐汇总

本专题整合了java学习网站相关内容,阅读专题下面的文章了解更多详细内容。

6

2026.01.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号