go的singleflight

golang.org/x/sync/singleflight 是 Go 语言的一个包
其主要用于解决 “多个相同请求并发查询,只需要一个请求去查询,其他的等待查询结果即可” 的问题
以此来减少不必要的重复操作,节省资源

比如有很多线程同时发出了相同的请求(使用了相同的键)
此时如果对每一个请求都做处理可能会浪费资源,使用 singleflight 包可以保证在同一时刻,对于相同的请求,只有一个真正的查询操作

var sg singleflight.Group

func main() {
    var wg sync.WaitGroup

    // 模拟10个并发请求
    for i := 0; i < 10; i++ {
        wg.Add(1)

        go func() {
            defer wg.Done()

            v, err, _ := sg.Do("database_query", func() (interface{}, error) {
                // 这里模拟一个耗时的数据库查询操作,只会被请求一次
                fmt.Println("database query start")
                time.Sleep(2 * time.Second)
                fmt.Println("database query done")
                return "query result", nil
            })

            if err != nil {
                fmt.Println(err)
                return
            }
            fmt.Println("request done, result: ", v)
        }()
    }

    wg.Wait()
}

在上述代码中,无论 Do 函数被调用多少次
只要 key 没有变,真正执行的操作 func 只会被执行一次
其余的调用都会等待这一次的结果

在返回值中,v 和 err 是操作 func 的返回结果
shared 是一个布尔值,表示这个结果是否被多个调用共享

相关推荐

  1. gosingleflight

    2024-03-10 01:16:03       20 阅读
  2. gosingleflight学习

    2024-03-10 01:16:03       23 阅读
  3. Go语言中同步原语:ErrGroup、Semaphore和SingleFlight

    2024-03-10 01:16:03       37 阅读
  4. Go语言GC

    2024-03-10 01:16:03       37 阅读
  5. 掌握 Go 计时器

    2024-03-10 01:16:03       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 01:16:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 01:16:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 01:16:03       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 01:16:03       20 阅读

热门阅读

  1. 音频设备的3种硬件接口- PCM,I2S和AC97

    2024-03-10 01:16:03       27 阅读
  2. FFmpeg--音频解码流程:aac解码pcm

    2024-03-10 01:16:03       24 阅读
  3. ubuntu下固定USB相机设备名称

    2024-03-10 01:16:03       22 阅读
  4. c++核心编程

    2024-03-10 01:16:03       22 阅读
  5. leetcode热题100刷题计划

    2024-03-10 01:16:03       19 阅读
  6. 在 Windows 右键菜单添加 Git Bash

    2024-03-10 01:16:03       24 阅读
  7. 如何快速解决leetcode 热题100

    2024-03-10 01:16:03       24 阅读