如何用Golang实现多文件并行上传,并发IO与协程同步的复杂操作?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1094个文字,预计阅读时间需要5分钟。
程序启动后不等待它跑完就退出,是多个文件上传时最常见的问题,上传没有报错但文件全丢失的根源。Go 不会自动等待。
常见错误现象:main 函数结束,程序直接退出,http.Post 还没发出去;或只传了前几个文件就停了。
- 在启动上传协程前调用
wg.Add(1),每个文件对应一次 Add - 在上传函数末尾(无论成功失败)调用
wg.Done(),别漏在 error 分支里 -
wg.Wait()放在所有go uploadFile(...)之后、main返回之前
别用 time.Sleep 代替 WaitGroup —— 网络延迟不可控,休眠短了丢文件,长了浪费时间。
http.Client 要复用,别在循环里 new
每个 http.Client 默认带自己的连接池和超时控制。在 for 循环里反复 &http.Client{},会导致 TCP 连接激增、端口耗尽,甚至触发 dial tcp: lookup xxx: no such host 这类看似 DNS 实际是资源不足的错误。
立即学习“go语言免费学习笔记(深入)”;
使用场景:上传几十个文件到同一域名(如 S3 兼容接口、自建 minio)时尤其明显。
本文共计1094个文字,预计阅读时间需要5分钟。
程序启动后不等待它跑完就退出,是多个文件上传时最常见的问题,上传没有报错但文件全丢失的根源。Go 不会自动等待。
常见错误现象:main 函数结束,程序直接退出,http.Post 还没发出去;或只传了前几个文件就停了。
- 在启动上传协程前调用
wg.Add(1),每个文件对应一次 Add - 在上传函数末尾(无论成功失败)调用
wg.Done(),别漏在 error 分支里 -
wg.Wait()放在所有go uploadFile(...)之后、main返回之前
别用 time.Sleep 代替 WaitGroup —— 网络延迟不可控,休眠短了丢文件,长了浪费时间。
http.Client 要复用,别在循环里 new
每个 http.Client 默认带自己的连接池和超时控制。在 for 循环里反复 &http.Client{},会导致 TCP 连接激增、端口耗尽,甚至触发 dial tcp: lookup xxx: no such host 这类看似 DNS 实际是资源不足的错误。
立即学习“go语言免费学习笔记(深入)”;
使用场景:上传几十个文件到同一域名(如 S3 兼容接口、自建 minio)时尤其明显。

