插件窝 干货文章 Go singleflight的shared返回值究竟表示什么?

Go singleflight的shared返回值究竟表示什么?

请求 shared 求是 key 699    来源:    2025-03-16

在Go语言的singleflight包中,shared返回值是一个布尔值,用于指示当前请求的结果是否是从其他并发的相同请求中共享的。

具体来说,singleflight包的主要目的是减少对相同资源的重复请求。当多个goroutine同时请求相同的资源时,singleflight会确保只有一个goroutine实际执行请求操作,而其他goroutine会等待并共享这个结果。

shared返回值的含义:

  • true:表示当前请求的结果是从其他并发的相同请求中共享的。也就是说,当前请求并没有真正执行操作,而是直接使用了其他请求的结果。
  • false:表示当前请求是第一个发起请求的goroutine,并且实际执行了操作。其他并发的相同请求将会共享这个结果。

示例代码:

package main

import (
    "fmt"
    "golang.org/x/sync/singleflight"
    "sync"
    "time"
)

func main() {
    var g singleflight.Group
    var wg sync.WaitGroup

    do := func(key string) {
        defer wg.Done()
        val, shared, err := g.Do(key, func() (interface{}, error) {
            // 模拟一个耗时的操作
            time.Sleep(100 * time.Millisecond)
            return "result", nil
        })
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        fmt.Printf("Key: %s, Value: %v, Shared: %v\n", key, val, shared)
    }

    wg.Add(3)
    go do("key1")
    go do("key1")
    go do("key2")

    wg.Wait()
}

输出示例:

Key: key1, Value: result, Shared: false
Key: key1, Value: result, Shared: true
Key: key2, Value: result, Shared: false

解释:

  • 第一个key1请求是实际执行操作的,因此sharedfalse
  • 第二个key1请求共享了第一个请求的结果,因此sharedtrue
  • key2请求是另一个不同的键,因此它也是实际执行操作的,sharedfalse

总结:

shared返回值帮助你区分当前请求是实际执行操作还是共享了其他请求的结果。这在调试和性能分析时非常有用,可以帮助你理解请求的执行路径和并发行为。