首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sync.Map或通道时

使用sync.Map或通道时
EN

Stack Overflow用户
提问于 2022-09-22 08:58:28
回答 1查看 48关注 0票数 -2

我正在编写程序,它解析了许多文件,寻找“有趣的”行。然后它在检查这些线以前是否被看到过。每个文件都使用单独的goroutine进行解析。我想知道哪种方法更好:

  1. 使用sync.Map或类似的

  1. 使用通道和单独的goroutine,这应该只负责唯一性检查(可能使用标准地图)。它将接收请求,并使用一些简单的东西来响应,比如“不唯一”或“唯一(并添加)”

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

EN

回答 1

Stack Overflow用户

发布于 2022-09-22 09:31:00

如果希望有可以访问全局映射以进行唯一检查的工作人员,则可以使用sync.RWMutex确保映射受到保护,例如:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73811891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档