基于 Gin 框架,在前端上传多文件到后台时(写入磁盘)使用了 goroutines,奇怪的是虽然并发执行了,但是上传消耗的时间却跟同步上传(没有使用 goroutines )差不多,难道是我使用的姿势不对?还是说多文件上传不能使用协程?
代码:
func UploadFileHandler(ctx *gin.Context) {
formData, _ := ctx.MultipartForm()
files := formData.File["fileList"]
start := time.Now()
var wg sync.WaitGroup
wg.Add(len(files))
for _, file := range files {
go func(file *multipart.FileHeader) {
fmt.Printf("(%s) upload...\n", file.Filename)
// 文件上传
filePath := filepath.Join(dirPath, file.Filename)
errors = ctx.SaveUploadedFile(file, filePath)
if errors != nil {
ctx.JSON( http.StatusBadRequest, gin.H{
"code": 400,
"error" : errors.Error(),
})
}
fmt.Printf("(%s) upload end...\n", file.Filename)
wg.Done()
}(file)
}
wg.Wait()
end := time.Since(start)
fmt.Printf("it takes %s\n", end)
ctx.JSON( http.StatusOK, gin.H{
"code": 200,
"msg": "上传成功",
})
}
执行结果:
(文件 4.zip) upload...
(文件 2.zip) upload...
(文件 3.zip) upload...
(文件 1.zip) upload...
(文件 4.zip) upload end...
(文件 2.zip) upload end...
(文件 1.zip) upload end...
(文件 3.zip) upload end...
it takes 713.0408ms
下面是没有使用协程的方式的执行结果:
(文件 4.zip) upload...
(文件 4.zip) upload end...
(文件 3.zip) upload...
(文件 3.zip) upload end...
(文件 2.zip) upload...
(文件 2.zip) upload end...
(文件 1.zip) upload...
(文件 1.zip) upload end...
it takes 730.0474ms
请问各位大佬这是什么原因...
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.