Go并发可视化解释

编程入门 行业动态 更新时间:2024-10-15 04:27:41

Go并发可视化解释

Go并发可视化解释

场景

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

1*aZnEggopv4Tsbyyj3e5JFg.png

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

1*qouGWmMAqY2CDrzz5widhQ.png

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

1*057bX4zo_LCzEkdzGyDYpA.png

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

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 mainimport ("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)
}

更多推荐

Go并发可视化解释

本文发布于:2023-12-05 01:47:34,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1662698.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!