登录
首页 >  Golang >  Go问答

利用 goroutine 处理 sync.Map 或通道

来源:stackoverflow

时间:2024-03-26 14:27:28 367浏览 收藏

在并行处理大量文件时,需要一种方法来检查特定行是否已在其他文件中见过。本文探讨了两种方法:使用同步映射(sync.Map)或使用通道和独立的 goroutine。文章建议使用 sync.Map 并使用读写互斥锁来保护对全局地图的访问,或使用并发安全映射来避免使用互斥锁。

问题内容

我正在编写一个程序来解析大量文件以查找“有趣”的行。然后它会检查这些线以前是否见过。每个文件都使用单独的 goroutine 进行解析。 我想知道哪种方法更好:

  1. 使用sync.Map或类似的东西
  2. 使用通道和单独的 goroutine,它们应该只负责唯一性检查(可能使用标准映射)。它将接收请求并以简单的内容响应,例如“不唯一”或“唯一(并添加)”

这些解决方案中是否有一个更受欢迎,或者两者都是错误的?


正确答案


如果您希望工作人员可以访问全局地图以进行唯一检查,您可以使用 sync.rwmutex 来确保地图受到保护,例如:

var (
  mutex sync.RWMutex = sync.RWMutex{}
  alreadySeen map[string]struct{} = make(map[string]struct{})
)

func Work() {
  for {
    Processing lines here...
    //Checking 
    mutex.RLock() //Lock for reading only
    if _, found := alreadySeen[line]; !found {
       mutex.RUnLock()
       mutex.Lock()
       alreadySeen[line] = struct{}{}
       mutex.UnLock()
    } else {
       mutex.RUnLock()
    }
  }
}

另一种方法是使用并发安全映射来跳过整个互斥,例如这个包:https://github.com/cornelk/hashmap

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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