go并发库singleflight的shared总是true
前言:singleflight.Do第三个参数是个布尔值,代表是否共享结果
问题:为什么我的第三个参数返回值总是true,不应该至少有一个是false吗
环境:centos7,cpu8核,go1.14
package mainimport (
"fmt"
"sync"
"time"
"golang.org/x/sync/singleflight"
)
func main() {
g := singleflight.Group{}
wg := sync.WaitGroup{}
for i := 0; i < 8; i++ {
wg.Add(1)
go func(j int) {
defer wg.Done()
val, err, shared := g.Do("userId", queryMysql)
if err != nil {
fmt.Println(err)
return
}
fmt.Printf("index: %d, val: %d, shared: %tn", j, val, shared)
}(i)
}
wg.Wait()
}
// 模拟数据库查询方法
func queryMysql() (interface{}, error) {
time.Sleep(time.Millisecond * 1)
fmt.Println("mysql query")
return 1, nil
}
执行结果:
回答
这个其实是你理解的问题,原文注释是:
The return value shared indicates whether v was given to multiple callers.
shared 只是表示返回 val 是否被多个调用者共享了。
只有某个调用者的协程执行的时候,其它协程没在执行,这个val是它独享的,才会返回false
以上是 go并发库singleflight的shared总是true 的全部内容, 来源链接: utcz.com/a/23689.html