登录
首页 >  Golang >  Go问答

使用go协程池来实现文件并行写入?

来源:stackoverflow

时间:2024-02-16 14:48:23 463浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《使用go协程池来实现文件并行写入?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我有一个切片 clientfiles,我正在按顺序迭代它并将其一一写入 s3 中,如下所示:

for _, v := range clientfiles {
  err := writetos3(v.filecontent, s3connection, v.filename, bucketname, v.foldername)
  if err != nil {
        fmt.println(err)
    }
}

上面的代码工作正常,但我想在 s3 中并行编写,这样我就可以加快速度。工作池实施在这里效果更好还是还有其他更好的选择? 我得到了下面使用等待组的代码,但我不确定这是否是更好的选择?

wg := sync.WaitGroup{}
for _, v := range clientFiles {
  wg.Add(1)
  go func(v ClientMapFile) {
    err := writeToS3(v.FileContent, s3Connection, v.FileName, bucketName, v.FolderName)
    if err != nil {
      fmt.Println(err)
    }      
  }(v)
}

正确答案


是的,并行化应该会有所帮助。

在更改 waitgroup 的使用后,您的代码应该可以正常运行。您需要将工作标记为“完成”并等待所有 goroutine 在 for 循环后完成。

var wg sync.WaitGroup
for _, v := range clientFiles {
  wg.Add(1)
  go func(v ClientMapFile) {
    defer wg.Done()
    err := writeToS3(v.FileContent, s3Connection, v.FileName, bucketName, v.FolderName)
    if err != nil {
      fmt.Println(err)
    }      
  }(v)
}
wg.Wait()

请注意,您的解决方案为 n 个文件创建 n 个 goroutine,如果文件数量很大,这可能不是最佳的。在这种情况下,请使用此模式 https://gobyexample.com/worker-pools 并尝试不同数量的工作线程,以找到在性能方面最适合您的模式。

以上就是《使用go协程池来实现文件并行写入?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>