Go并发可视化解释 – sync.WaitGroup

场景

Avito是一名校车司机,他帮助4个Gopher孩子上学。每天,Avito在他们的社区等待孩子们。他不知道孩子们需要多长时间,但他确切地知道有4个孩子他需要等待。

1*aZnEggopv4Tsbyyj3e5JFg.png

当一个孩子准备好时,他/她会说:Done(),将计数器减1。Avito仍然被阻塞,因为计数器仍然大于0。他必须等到所有其他孩子准备好。

Go并发可视化解释 – sync.WaitGroup
1*qouGWmMAqY2CDrzz5widhQ.png

如果有两个孩子同时准备好,它们的同时准备会导致WaitGroup出现不一致吗?绝对不会。与sync包中的大多数其他组件一样,WaitGroup具有内置的同步机制,以处理并发。因此,计数器减少了准备好的孩子数量。

Go并发可视化解释 – sync.WaitGroup
1*057bX4zo_LCzEkdzGyDYpA.png

在最后一个孩子准备好后,Avito启动引擎,将他们送到学校。

Go并发可视化解释 – sync.WaitGroup
1*rjH8OR3t7QgUx-dO-Iszeg.png

就是这样!正如我所说,sync.WaitGroup很简单。

超时

如果一个孩子花费太多时间准备,他们会不会因此迟到?如果Avito在时间到达时不管怎样都开始行驶会更好吗?嗯,Golang倾向于保持一切尽可能简洁,因此与其他编程语言中的CountDownLatch(例如Java中的)不同,sync.WaitGroup默认情况下不支持超时。在这种情况下,选择语句可能会有所帮助。

func main() {    wg := sync.WaitGroup{}    wg.Add(1)
go func() { defer wg.Done() time.Sleep(5 * time.Second) }()
done := make(chan bool)
go func() { wg.Wait() close(done) }()
select { case <-done: log.Println(\\\"All done\\\") case <-time.After(1 * time.Second): log.Println(\\\"Hit timeout\\\") }}

孩子等待

在上面的示例中,Avito(主Goroutine)等待孩子(子Goroutines)。当我们希望子Goroutines等待主Goroutine时,WaitGroup也可以使用。想象一下孩子们正在进行体育课。Torcher – 体育老师,在学生中主持比赛。他向WaitGroupAdd(1),并要求所有孩子在相同的WaitGroupWait()

1*btDQK4QKsu1HkEpfJDa2EA.png

当Torcher调用wg.Done()时,计数器变为0,允许所有孩子同时开始奔跑。

1*VkV3VlRTx5jxXhauBH0_Dg.png

展示你的代码!

package main
import ( \\\"log\\\" \\\"sync\\\" \\\"time\\\")
func main() { kids := []string{\\\"Partier\\\", \\\"Stringer\\\", \\\"Candier\\\", \\\"Swimmer\\\"} wg := sync.WaitGroup{} wg.Add(len(kids))
for _, kid := range kids { go func(name string) { defer wg.Done() prepare(name) }(kid) }
log.Printf(\\\"Avito: I\\\'m waiting for %d kids\\\\n\\\", len(kids)) wg.Wait() log.Println(\\\"Avito: The kids are all ready, go!\\\")}
func prepare(name string) { log.Printf(\\\"%v: I\\\'m preparing for school\\\\n\\\", name) time.Sleep(2 * time.Second) log.Printf(\\\"%v: I\\\'m ready\\\\n\\\", name)}

原创文章,作者:小技术君,如若转载,请注明出处:https://www.sudun.com/ask/33916.html

(0)
小技术君's avatar小技术君
上一篇 2024年4月14日 下午6:17
下一篇 2024年4月14日 下午6:19

相关推荐

  • CDN龙头上市公司

    CDN龙头上市公司 首段:本文将深入探讨CDN(内容分发网络)领域的龙头上市公司,重点介绍其产品”速盾CDN”在解决网络内容分发中所面临的挑战和问题。 在当…

    2024年5月11日
    0
  • iOS17.5 最终版推出!

    iOS系统,一个让无数手机用户翘首以待的更新,每一次发布都是一场期待与惊喜的交锋。当iOS17.5RC最终版本推出,究竟会带来怎样的变革呢?而iOS17.5正式版的到来,又会在何时…

    2024年5月30日
    0
  • 数字化转型与CDN的关键作用:加速业务增长与提升用户体验

    在当今竞争激烈的市场中,越来越多的组织正在为其业务采纳数字化存在。特别是媒体、出版、旅游、零售、金融和医疗保健等行业,正转向数字解决方案以超越竞争对手,推动销售并提高利润底线。 获…

    CDN资讯 2024年7月8日
    0
  • 向量数据库:最新热门技术

    以下是向量数据库与其他类型数据库的比较图: 什么是向量数据库?向量数据库是一种用于快速检索和相似性搜索的数据库,它索引和存储向量嵌入。它提供CRUD操作、元数据过滤和水平扩展等功能…

    CDN资讯 2024年4月21日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注