NOTE
sync.singleflight
1. 使用 2. 参考 sync\.singleflight 到底怎么用才对?
这是历史学习笔记,可能存在过时或不完整的理解。
1. 使用
package main
import (
"context"
"fmt"
"time"
"golang.org/x/sync/singleflight"
)
type data string
func main() {
// 设置一秒后超时的context
d := time.Now().Add(1 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), d)
defer cancel()
var ret singleflight.Result
var g singleflight.Group
key := "https://weibo.com/1227368500/H3GIgngon"
for i := 0; i < 5; i++ {
go func(j int) {
ch := g.DoChan(key, func() (interface{}, error) {
ret, err := find(ctx, key)
return ret, err
})
select {
case <-ctx.Done():
// 1s后超时
fmt.Println(ctx.Err())
case ret = <-ch: // Received result from channel
fmt.Printf(" val: %v, shared: %v\n", ret.Val, ret.Shared)
}
}(i)
}
fmt.Println("22222222222222222222222222")
time.Sleep(time.Hour)
}
func find(ctx context.Context, query string) (data, error) {
time.Sleep(time.Minute)
return data(fmt.Sprintf("result for %q", query)), nil
}
讨论
使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看