gpt4 book ai didi

go - 如何在Goroutine中处理错误

转载 作者:行者123 更新时间:2023-12-01 22:08:55 29 4
gpt4 key购买 nike

我有一项用于将文件上传到AWS S3的服务。我试图与goroutines一起使用,而不上传文件。如果我上传的文件中没有goroutine,则应等到完成后再给出响应,如果我使用goroutine,则它将在后台运行并更快地响应客户端。

如果我使用goroutines,如果上传失败怎么办?然后该文件没有上传到AWS S3?你能告诉我如何处理吗?

这是我上传文件的功能

func uploadToS3(s *session.Session, size int64, name string , buffer []byte)( string , error) {

tempFileName := "pictures/" + bson.NewObjectId().Hex() + "-" + filepath.Base(name)

_, err := s3.New(s).PutObject(&s3.PutObjectInput{
Bucket: aws.String("myBucketNameHere"),
Key: aws.String(tempFileName),
ACL: aws.String("public-read"),
Body: bytes.NewReader(buffer),
ContentLength: aws.Int64(int64(size)),
ContentType: aws.String(http.DetectContentType(buffer)),
ContentDisposition: aws.String("attachment"),
ServerSideEncryption: aws.String("AES256"),
StorageClass: aws.String("INTELLIGENT_TIERING"),
})

if err != nil {
return "", err
}

return tempFileName, err
}

func UploadFile(db *gorm.DB) func(c *gin.Context) {
return func(c *gin.Context) {
file, err := c.FormFile("file")

f, err := file.Open()
if err != nil {
fmt.Println(err)
}

defer f.Close()
buffer := make([]byte, file.Size)
_, _ = f.Read(buffer)
s, err := session.NewSession(&aws.Config{
Region: aws.String("location here"),
Credentials: credentials.NewStaticCredentials(
"id",
"key",
"",
),
})
if err != nil {
fmt.Println(err)
}

go uploadToS3(s, file.Size, file.Filename, buffer)

c.JSON(200, fmt.Sprintf("Image uploaded successfully"))
}
}

我也在想,如果有很多请求每5-10分钟上传超过10000+个文件?是否会因为请求过多而无法上传某些文件?

最佳答案

对于任何异步任务(例如,在后台go-routine中上传文件),都可以编写上传函数,以将chan error返回给调用者。然后,调用者可以稍后通过从chan error读取对文件上载最终错误(如果没有错误,则为nil)使用react。

但是,如果您接受上传请求,则建议您创建一个工作上传例程,该例程可以通过 channel 接受文件上传。输出“错误” channel 可以跟踪成功/失败。并且,如果需要,可以将上传的错误写回到原始的上传 channel 队列(包括重试计数和重试max-这样有问题的有效负载不会永远循环)。

关于go - 如何在Goroutine中处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58424552/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com