日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-10-23 17:05:57 328觀看
導讀場景Avito是一名校車司機,他幫助4個Gopher孩子上學。每天,Avito在他們的社區(qū)等待孩子們。他不知道孩子們需要多長時間,但他確切地知道有4個孩子他需要等待。1*aZnEggopv4Tsbyyj3e5JFg.png當一個孩子準備好時,他/她會說:Don

場景

Avito是一名校車司機,他幫助4個Gopher孩子上學。每天,Avito在他們的社區(qū)等待孩子們。他不知道孩子們需要多長時間,但他確切地知道有4個孩子他需要等待。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*aZnEggopv4Tsbyyj3e5JFg.pngbXg28資訊網——每日最新資訊28at.com

當一個孩子準備好時,他/她會說:Done(),將計數(shù)器減1。Avito仍然被阻塞,因為計數(shù)器仍然大于0。他必須等到所有其他孩子準備好。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*qouGWmMAqY2CDrzz5widhQ.pngbXg28資訊網——每日最新資訊28at.com

如果有兩個孩子同時準備好,它們的同時準備會導致WaitGroup出現(xiàn)不一致嗎?絕對不會。與sync包中的大多數(shù)其他組件一樣,WaitGroup具有內置的同步機制,以處理并發(fā)。因此,計數(shù)器減少了準備好的孩子數(shù)量。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*057bX4zo_LCzEkdzGyDYpA.pngbXg28資訊網——每日最新資訊28at.com

在最后一個孩子準備好后,Avito啟動引擎,將他們送到學校。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*rjH8OR3t7QgUx-dO-Iszeg.pngbXg28資訊網——每日最新資訊28at.com

就是這樣!正如我所說,sync.WaitGroup很簡單。bXg28資訊網——每日最新資訊28at.com

超時

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

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 - 體育老師,在學生中主持比賽。他向WaitGroup中Add(1),并要求所有孩子在相同的WaitGroup上Wait()。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*btDQK4QKsu1HkEpfJDa2EA.pngbXg28資訊網——每日最新資訊28at.com

當Torcher調用wg.Done()時,計數(shù)器變?yōu)?,允許所有孩子同時開始奔跑。bXg28資訊網——每日最新資訊28at.com

bXg28資訊網——每日最新資訊28at.com

1*VkV3VlRTx5jxXhauBH0_Dg.pngbXg28資訊網——每日最新資訊28at.com

展示你的代碼!

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)}

本文鏈接:http://www.www897cc.com/showinfo-26-14610-0.htmlGo并發(fā)可視化解釋:sync.WaitGroup

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: private final、@Autowired、@Resource你更喜歡哪個?

下一篇: Fiber Golang:Golang中的強大Web框架

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 安溪县| 姜堰市| 榆树市| 博罗县| 绥江县| 新营市| 阳泉市| 平昌县| 嘉祥县| 定日县| 沙洋县| 林周县| 珲春市| 平昌县| 电白县| 阿勒泰市| 泗阳县| 米易县| 乐业县| 横山县| 花垣县| 海南省| 光山县| 郸城县| 蓬莱市| 普陀区| 偃师市| 文成县| 甘孜| 武穴市| 杭锦旗| 绿春县| 南召县| 枞阳县| 丹凤县| 霞浦县| 墨玉县| 鸡西市| 长宁县| 凤庆县| 安吉县|