singleflight 使用记录以及源码阅读

[复制链接]
发表于 2022-11-16 10:04:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
singleflight 使用方法以及源码阅读

1、简介

安装方式:
  1. go get -u golang.org/x/sync/singleflight
复制代码
singleflight 是Go官方扩展同步包的一个库。通过给每次函数调用分配一个key,相同key的函数并发调用时,在函数执行期间,相同函数的调用,只会被执行一次,返回相同的结果。其本质是对函数调用的结果进行复用。
2、使用方法

2.1 使用Do获取函数执行结果

Do方法是同步返回函数执行结果
  1. package main
  2. import (
  3.         "fmt"
  4.         "golang.org/x/sync/singleflight"
  5.         "runtime"
  6.         "sync"
  7.         "time"
  8. )
  9. func main()  {
  10.         var sg singleflight.Group
  11.         var wg sync.WaitGroup
  12.         for i := 0; i < 10; i++ {
  13.                 wg.Add(1)
  14.                 go func(j int) {
  15.                         defer wg.Done()
  16.                         v, err, shared := sg.Do("testDo", testDo)
  17.                         fmt.Printf("i: %v, v:%v, err:%v, shared:%v\n", j, v, err, shared)
  18.                 }(i)
  19.         }
  20.         wg.Wait()
  21. }
  22. func testDo() (interface{}, error) {
  23.         // 模拟函数执行需要的时间
  24.         time.Sleep(time.Millisecond)
  25.         return "testDo", nil
  26. }
复制代码
2.2 使用DoChan获取函数执行结果

DoChan返回一个 channel,函数执行的结果通过 channel 来进行传递。
[code]package mainimport (        "fmt"        "golang.org/x/sync/singleflight"        "runtime"        "sync"        "time")func main()  {        var sg singleflight.Group        var wg sync.WaitGroup        for i := 0; i < 10; i++ {                wg.Add(1)                go func(j int) {                        defer wg.Done()                        ch := sg.DoChan("testDoChan", testDoChan)                        select {                        case ret :=
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表