Tip #75 使用singleflight优化多次调用

原始链接: Golang Tip #75: Optimize multiple calls with singleflight.

假设您有一个从网络获取数据或执行 I/O 的函数,大约需要 3 秒钟:

img1

上述函数会在 10 秒后发出一个不同的数字。

  • 现在,如果您连续调用这个函数 3 次,最终总共需要等待约 9 秒钟。
  • 如果您决定使用 3 个 goroutines,总等待时间可能会降至 3 秒左右,但您仍然要运行该函数 3 次才能得到相同的结果。(~99%)

这就是 singleflight 软件包发挥作用的地方,它非常有用。您可以在http://golang.org/x/sync/singleflight.... 找到它的详细信息。

这个软件包可以帮助我们只运行一次函数,无论在 3 秒钟内调用多少次,它都能返回一个可靠的结果。

img2

这对于优化耗时较长或耗费大量资源的函数来说非常有用。下面是它的工作原理: 我们首先创建一个 singleflight∙Group 对象。

然后,我们将获取昂贵数据的函数传递到该对象的 group∙Do() 方法中。group∙Do 返回:(result any, err error, shared bool),其中的 "shared"(共享)部分非常简单,它只是表示结果是否在多次调用中共享。

基本上就是这样

"'key" 参数的作用是什么?

key 本质上是请求的标识符。

当多个请求具有相同的关键字时,singleflight就会意识到它们请求的是同一件事。

您可以再这里看到实际操作: go.dev/play/p/dxQQrzn...

使用这种方法,如果同一函数被同时调用多次 ,则只对该函数进行一次实际调用。然后,所有调用者共享这一次调用的结果。