成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go并發(fā)可視化解釋:sync.WaitGroup

開發(fā)
Golang傾向于保持一切盡可能簡潔,因此與其他編程語言中的CountDownLatch不同,sync.WaitGroup默認(rèn)情況下不支持超時。在這種情況下,選擇語句可能會有所幫助。

場景

Avito是一名校車司機(jī),他幫助4個Gopher孩子上學(xué)。每天,Avito在他們的社區(qū)等待孩子們。他不知道孩子們需要多長時間,但他確切地知道有4個孩子他需要等待。

1*aZnEggopv4Tsbyyj3e5JFg.png

當(dāng)一個孩子準(zhǔn)備好時,他/她會說:Done(),將計數(shù)器減1。Avito仍然被阻塞,因為計數(shù)器仍然大于0。他必須等到所有其他孩子準(zhǔn)備好。

1*qouGWmMAqY2CDrzz5widhQ.png

如果有兩個孩子同時準(zhǔn)備好,它們的同時準(zhǔn)備會導(dǎo)致WaitGroup出現(xiàn)不一致嗎?絕對不會。與sync包中的大多數(shù)其他組件一樣,WaitGroup具有內(nèi)置的同步機(jī)制,以處理并發(fā)。因此,計數(shù)器減少了準(zhǔn)備好的孩子數(shù)量。

1*057bX4zo_LCzEkdzGyDYpA.png

在最后一個孩子準(zhǔn)備好后,Avito啟動引擎,將他們送到學(xué)校。

1*rjH8OR3t7QgUx-dO-Iszeg.png

就是這樣!正如我所說,sync.WaitGroup很簡單。

超時

如果一個孩子花費太多時間準(zhǔn)備,他們會不會因此遲到?如果Avito在時間到達(dá)時不管怎樣都開始行駛會更好嗎?嗯,Golang傾向于保持一切盡可能簡潔,因此與其他編程語言中的CountDownLatch(例如Java中的)不同,sync.WaitGroup默認(rèn)情況下不支持超時。在這種情況下,選擇語句可能會有所幫助。

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)。當(dāng)我們希望子Goroutines等待主Goroutine時,WaitGroup也可以使用。想象一下孩子們正在進(jìn)行體育課。Torcher - 體育老師,在學(xué)生中主持比賽。他向WaitGroup中Add(1),并要求所有孩子在相同的WaitGroup上Wait()。

1*btDQK4QKsu1HkEpfJDa2EA.png

當(dāng)Torcher調(diào)用wg.Done()時,計數(shù)器變?yōu)?,允許所有孩子同時開始奔跑。

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)
}
責(zé)任編輯:趙寧寧 來源: 小技術(shù)君
相關(guān)推薦

2023-09-25 12:45:45

Go 語言可視化sync.Mute

2023-10-06 23:31:25

可視化Go

2023-09-15 11:32:18

selectGo可視化解釋

2024-06-05 11:06:22

Go語言工具

2023-06-05 09:23:00

Golang同步工具

2023-09-11 10:17:20

Go編程語言

2024-01-08 13:40:00

并發(fā)安全? 數(shù)量

2025-04-03 09:12:26

GolangWaitGroup工具

2017-11-10 11:27:48

Go并行算法

2021-01-28 10:55:31

算法可視化數(shù)據(jù)

2023-01-30 15:41:10

Channel控制并發(fā)

2024-09-06 10:48:13

2020-07-01 09:08:55

神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)網(wǎng)絡(luò)

2017-12-26 14:05:21

潤乾大屏可視化

2025-03-24 00:25:00

Go語言并發(fā)編程

2021-09-30 09:21:28

Go語言并發(fā)編程

2024-10-14 08:51:52

協(xié)程Go語言

2024-08-12 10:52:00

AI模型

2020-03-11 14:39:26

數(shù)據(jù)可視化地圖可視化地理信息

2011-07-11 22:22:38

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲成人精品久久 | 精品国产欧美一区二区三区成人 | 日韩成人在线电影 | 黄视频网址 | 国产精品一区久久久 | 国产三级精品视频 | 亚洲一区二区三区在线 | 国产精品成人国产乱 | 国产精品永久免费视频 | 亚洲精品一区在线观看 | 日本成人二区 | 男人天堂国产 | 亚洲天堂成人在线视频 | 91九色在线观看 | 一二三在线视频 | 久久成人人人人精品欧 | 国产精品成人一区二区三区 | 国产精品福利视频 | 在线不卡一区 | 成人二区| 99精品国产一区二区三区 | 亚洲综合在线一区二区 | 91久操视频 | 欧产日产国产精品99 | 欧美精品欧美精品系列 | 亚洲成a人片 | av色站 | 91九色porny首页最多播放 | 亚洲一区二区免费 | www.日本三级 | 国产韩国精品一区二区三区 | 日本精品久久久久久久 | 天天影视网天天综合色在线播放 | 国产在线精品一区二区三区 | 国产区精品 | 欧美一区二区网站 | 亚洲精品久久久一区二区三区 | 亚洲欧美一区二区三区视频 | 亚洲精品久久久一区二区三区 | 欧美一区二区二区 | 国产精品亚洲视频 |