Tip #75 使用singleflight优化多次调用
原始链接: Golang Tip #75: Optimize multiple calls with singleflight.
假设您有一个从网络获取数据或执行 I/O 的函数,大约需要 3 秒钟:
上述函数会在 10 秒后发出一个不同的数字。
- 现在,如果您连续调用这个函数 3 次,最终总共需要等待约 9 秒钟。
- 如果您决定使用 3 个 goroutines,总等待时间可能会降至 3 秒左右,但您仍然要运行该函数 3 次才能得到相同的结果。(~99%)
这就是 singleflight 软件包发挥作用的地方,它非常有用。您可以在http://golang.org/x/sync/singleflight.... 找到它的详细信息。
这个软件包可以帮助我们只运行一次函数,无论在 3 秒钟内调用多少次,它都能返回一个可靠的结果。
这对于优化耗时较长或耗费大量资源的函数来说非常有用。下面是它的工作原理: 我们首先创建一个 singleflight∙Group
对象。
然后,我们将获取昂贵数据的函数传递到该对象的 group∙Do()
方法中。group∙Do
返回:(result any, err error, shared bool
),其中的 "shared
"(共享)部分非常简单,它只是表示结果是否在多次调用中共享。
基本上就是这样
"'key" 参数的作用是什么?
key 本质上是请求的标识符。
当多个请求具有相同的关键字时,singleflight
就会意识到它们请求的是同一件事。
您可以再这里看到实际操作: go.dev/play/p/dxQQrzn...
使用这种方法,如果同一函数被同时调用多次 ,则只对该函数进行一次实际调用。然后,所有调用者共享这一次调用的结果。