
singleflight.do 中 shared 参数始终为 true
问题:
在使用 singleflight.do 函数时,发现第三个布尔参数 shared 总是返回 true。为什么在这种情况下,不应至少有一个协程返回 false 呢?
环境:
代码示例:
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 的原因是什么?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号