登录
首页 >  Golang >  Go教程

singleflight.Do 中 shared 参数始终为 true 的原因是什么?

时间:2024-10-25 13:56:37 116浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《singleflight.Do 中 shared 参数始终为 true 的原因是什么?》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

singleflight.Do 中 shared 参数始终为 true 的原因是什么?

singleflight.do 中 shared 参数始终为 true

问题:
在使用 singleflight.do 函数时,发现第三个布尔参数 shared 总是返回 true。为什么在这种情况下,不应至少有一个协程返回 false 呢?

环境:

  • centos 7
  • 8 核 cpu
  • go 1.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
}

结果:

index: 0, val: 1, shared: true
index: 1, val: 1, shared: true
index: 2, val: 1, shared: true
index: 3, val: 1, shared: true
index: 4, val: 1, shared: true
index: 5, val: 1, shared: true
index: 6, val: 1, shared: true
index: 7, val: 1, shared: true

解答:

你对 shared 参数的理解有误。shared 参数指示的是返回的 val 是否被多个调用者共享。

只有在一个调用者的协程执行时,而其他协程没有执行,该 val 才属于其独占,此时才会返回 false。

在示例代码中,所有 8 个协程同时执行,因此 val 始终被多个调用者共享,导致 shared 参数始终为 true。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《singleflight.Do 中 shared 参数始终为 true 的原因是什么?》文章吧,也可关注golang学习网公众号了解相关技术文章。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>