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 <p><strong>结果:</strong></p>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 的原因是什么?的详细内容,更多请关注其它相关文章!