安装singleflight
go get -u golang.org/x/sync/singleflight
基本使用
package main
import (
"fmt"
"golang.org/x/sync/singleflight"
"log"
"sync"
)
var singleHandle singleflight.Group
func main() {
group := sync.WaitGroup{}
for i := 0; i < 10; i++ {
group.Add(1)
go func(i int) {
defer group.Done()
fmt.Printf("goroutine #%d got result: %s\n", i, GetName("key"))
}(i)
}
group.Wait()
fmt.Println("全部执行完毕")
}
func GetName(key string) string {
ret, err, shared := singleHandle.Do(key, func() (interface{}, error) {
log.Printf("getting %s from database\n", key)
log.Printf("setting %s in cache\n", key)
return "value", nil
})
if err != nil {
fmt.Printf("GetName error:%s\n", err)
return ""
}
fmt.Printf("shared: %v ", shared)
return ret.(string)
}