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: %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

回到顶部