NOTE

sync.singleflight

1. 使用 2. 参考 sync\.singleflight 到底怎么用才对?

Go约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

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
}

2. 参考

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看