Go singlefight 源码详解|图解
Go singleflight 是一个用于防止重复做相同工作的库,通过确保只有一个调用正在进行,其余调用将等待第一个调用完成。
以下是使用 Go singleflight 的一个简单示例:
package main
import (
"fmt"
"sync"
"time"
"golang.org/x/sync/singleflight"
)
var (
group singleflight.Group
)
func slowOperation(key string) (interface{}, error) {
// 模拟耗时操作
time.Sleep(time.Second)
return fmt.Sprintf("result for %s", key), nil
}
func doWork(key string) (string, error) {
// 使用 singleflight.Do 来确保同一个 key 的耗时操作只执行一次
res, err, _ := group.Do(key, func() (interface{}, error) {
return slowOperation(key)
})
if err != nil {
return "", err
}
return res.(string), nil
}
func main() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(i int) {
defer wg.Done()
result, err := doWork(fmt.Sprintf("key%d", i))
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Result:", result)
}(i)
}
wg.Wait()
}
在这个例子中,我们有一个耗时的操作 slowOperation
,它模拟了一些 I/O 或计算密集型任务。doWork
函数使用 singleflight.Group 来确保对于同一个 key 的 slowOperation
只执行一次,不管有多少个并发的调用请求,因为它们都会得到相同的结果,并且等待第一个请求完成。
这个示例展示了如何使用 Go singleflight 来避免在高并发环境下执行重复的耗时操作,从而提高系统的性能和资源利用效率。
评论已关闭