go并发库singleflight的shared总是true的问题

前言:singleflight.Do第三个参数是个布尔值,代表是否共享结果
问题:为什么我的第三个参数返回值总是true,不应该至少有一个是false吗
环境:centos7,cpu8核,go1.14

package main

import (
    "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: %t\n", j, val, shared)
        }(i)
    }

    wg.Wait()

}

// 模拟数据库查询方法
func queryMysql() (interface{}, error) {
    time.Sleep(time.Millisecond * 1)
    fmt.Println("mysql query")
    return 1, nil
}

执行结果:
image.png

阅读 2.9k
1 个回答

这个其实是你理解的问题,原文注释是:

The return value shared indicates whether v was given to multiple callers.

shared 只是表示返回 val 是否被多个调用者共享了。
只有某个调用者的协程执行的时候,其它协程没在执行,这个val是它独享的,才会返回false

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题