我正在编写程序,它解析了许多文件,寻找“有趣的”行。然后它在检查这些线以前是否被看到过。每个文件都使用单独的goroutine进行解析。我想知道哪种方法更好:
,
。
这些解决方案中有哪个更受欢迎,或者两者都是错误的?
发布于 2022-09-22 09:31:00
如果希望有可以访问全局映射以进行唯一检查的工作人员,则可以使用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
https://stackoverflow.com/questions/73811891
复制相似问题