马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
singleflight 使用方法以及源码阅读
1、简介
安装方式:- go get -u golang.org/x/sync/singleflight
复制代码 singleflight 是Go官方扩展同步包的一个库。通过给每次函数调用分配一个key,相同key的函数并发调用时,在函数执行期间,相同函数的调用,只会被执行一次,返回相同的结果。其本质是对函数调用的结果进行复用。
2、使用方法
2.1 使用Do获取函数执行结果
Do方法是同步返回函数执行结果- package main
- import (
- "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()
- v, err, shared := sg.Do("testDo", testDo)
- fmt.Printf("i: %v, v:%v, err:%v, shared:%v\n", j, v, err, shared)
- }(i)
- }
- wg.Wait()
- }
- func testDo() (interface{}, error) {
- // 模拟函数执行需要的时间
- time.Sleep(time.Millisecond)
- return "testDo", nil
- }
复制代码 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 := |