Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
227 views
in Technique[技术] by (71.8m points)

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
", j, val, shared)
        }(i)
    }

    wg.Wait()

}

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

执行结果:
image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

56.7k users

...