寻找更 Go 式的解决方案来解决以下问题:
假设服务器有多个并行传入请求,要求使用 key 的资源key。由于计算此资源非常昂贵/耗时,因此我们希望确保仅计算一次。有无限多个可能的键。
一种简单的实现:
if hasCachedValue(key) {
return cachedValue(key)
}
if somebodyElseWorkingOn(key) {
waitUntilReady(key)
} else {
buildCacheValue(key) // time consuming
}
return cachedValue(key)
到目前为止,我们已经使用共享解决了这个问题map[string]chan bool,其中第一个请求插入了 chan for key,而后续请求在值准备好时等待该 chan 的关闭。为了保护地图,我们使用了sync.Mutex,但我们感觉有一个更好、更 Go 式的解决方案。
波斯汪
肥皂起泡泡
梵蒂冈之花
相关分类