最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go基礎教程系列之WaitGroup用法實例詳解

 更新時間:2022年04月18日 09:08:10   作者:駿馬金龍  
這篇文章主要介紹了Go基礎教程系列之WaitGroup用法實例詳解,需要的朋友可以參考下

正常情況下,新激活的goroutine(協(xié)程)的結(jié)束過程是不可控制的,唯一可以保證終止goroutine(協(xié)程)的行為是main goroutine(協(xié)程)的終止。也就是說,我們并不知道哪個goroutine(協(xié)程)什么時候結(jié)束。

但很多情況下,我們正需要知道goroutine(協(xié)程)是否完成。這需要借助sync包的WaitGroup來實現(xiàn)。

WatiGroup是sync包中的一個struct類型,用來收集需要等待執(zhí)行完成的goroutine(協(xié)程)。下面是它的定義:

type WaitGroup struct {
        // Has unexported fields.
}
    A WaitGroup waits for a collection of goroutines to finish. The main
    goroutine calls Add to set the number of goroutines to wait for. Then each
    of the goroutines runs and calls Done when finished. At the same time, Wait
    can be used to block until all goroutines have finished.

    A WaitGroup must not be copied after first use.


func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()

它有3個方法:

  • Add():每次激活想要被等待完成的goroutine(協(xié)程)之前,先調(diào)用Add(),用來設置或添加要等待完成的goroutine(協(xié)程)數(shù)量
    • 例如Add(2)或者兩次調(diào)用Add(1)都會設置等待計數(shù)器的值為2,表示要等待2個goroutine(協(xié)程)完成
  • Done():每次需要等待的goroutine(協(xié)程)在真正完成之前,應該調(diào)用該方法來人為表示goroutine(協(xié)程)完成了,該方法會對等待計數(shù)器減1
  • Wait():在等待計數(shù)器減為0之前,Wait()會一直阻塞當前的goroutine(協(xié)程)

也就是說,Add()用來增加要等待的goroutine(協(xié)程)的數(shù)量,Done()用來表示goroutine(協(xié)程)已經(jīng)完成了,減少一次計數(shù)器,Wait()用來等待所有需要等待的goroutine(協(xié)程)完成。

下面是一個示例,通過示例很容易理解。

package main

import (  
    "fmt"
    "sync"
    "time"
)

func process(i int, wg *sync.WaitGroup) {  
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}

func main() {  
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1)
        go process(i, &wg)
    }
    wg.Wait()
    fmt.Println("All go routines finished executing")
}

上面激活了3個goroutine,每次激活goroutine之前,都先調(diào)用Add()方法增加一個需要等待的goroutine計數(shù)。每個goroutine都運行process()函數(shù),這個函數(shù)在執(zhí)行完成時需要調(diào)用Done()方法來表示goroutine的結(jié)束。激活3個goroutine后,main goroutine會執(zhí)行到Wait(),由于每個激活的goroutine運行的process()都需要睡眠2秒,所以main goroutine在Wait()這里會阻塞一段時間(大約2秒),當所有goroutine都完成后,等待計數(shù)器減為0,Wait()將不再阻塞,于是main goroutine得以執(zhí)行后面的Println()。

還有一點需要特別注意的是process()中使用指針類型的*sync.WaitGroup作為參數(shù),這里不能使用值類型的sync.WaitGroup作為參數(shù),因為這意味著每個goroutine都拷貝一份wg,每個goroutine都使用自己的wg。這顯然是不合理的,這3個goroutine應該共享一個wg,才能知道這3個goroutine都完成了。實際上,如果使用值類型的參數(shù),main goroutine將會永久阻塞而導致產(chǎn)生死鎖。

更多關于Go WaitGroup用法教程請查看下面的相關鏈接

相關文章

  • Go微服務項目配置文件的定義和讀取示例詳解

    Go微服務項目配置文件的定義和讀取示例詳解

    這篇文章主要為大家介紹了Go微服務項目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go反射中type和kind區(qū)別比較詳析

    Go反射中type和kind區(qū)別比較詳析

    這篇文章主要給大家介紹了關于Go反射中type和kind區(qū)別比較的相關資料,Type是接口類型,Value是Struct類型,Type是類型描述,而Value是具體的值,需要的朋友可以參考下
    2023-10-10
  • 在 Golang 中實現(xiàn)一個簡單的Http中間件過程詳解

    在 Golang 中實現(xiàn)一個簡單的Http中間件過程詳解

    本文在go web中簡單的實現(xiàn)了中間件的機制,這樣帶來的好處也是顯而易見的,當然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關的功能,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-07-07
  • 使用Golang調(diào)用攝像頭并進行圖像處理

    使用Golang調(diào)用攝像頭并進行圖像處理

    近年來,攝像頭成為了我們生活中不可或缺的設備之一,從智能手機到安全監(jiān)控系統(tǒng),無處不在的攝像頭給我們帶來了便利和安全,在開發(fā)攝像頭相關的應用程序時,選擇一種高效和易用的編程語言是非常重要的,本文將介紹如何使用Golang調(diào)用攝像頭并進行圖像處理
    2023-11-11
  • Go語言利用aicli實現(xiàn)輕松調(diào)用DeepSeek和ChatGPT

    Go語言利用aicli實現(xiàn)輕松調(diào)用DeepSeek和ChatGPT

    這篇文章主要為大家介紹了一款用Go語言編寫的AI助手客戶端庫——aicli,該庫不僅支持ChatGPT,還集成了DeepSeek,感興趣的小伙伴可以了解一下
    2025-03-03
  • GoAdminGroup/go-admin的安裝和運行的教程詳解

    GoAdminGroup/go-admin的安裝和運行的教程詳解

    這篇文章主要介紹了GoAdminGroup/go-admin的安裝和運行的教程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Golang切片刪除指定元素的三種方法對比

    Golang切片刪除指定元素的三種方法對比

    Go語言并沒有提供用于刪除元素的語法或接口,而是通過利用切片本身的特性來刪除元素—追加元素,這篇文章主要給大家介紹了關于Golang切片刪除指定元素的三種方法,需要的朋友可以參考下
    2022-06-06
  • 如何在?Go語言中使用日志包

    如何在?Go語言中使用日志包

    這篇文章主要介紹了如何在?Go語言中使用日志包,日志文件就是一種快速找到這些?bug,更好地了解程序工作狀態(tài)的方法,下文基于go語言介紹該詳細需要的小伙伴可以參考一下
    2022-04-04
  • GO中的時間操作總結(jié)(time&dateparse)

    GO中的時間操作總結(jié)(time&dateparse)

    日常開發(fā)過程中,對于時間的操作可謂是無處不在,但是想實現(xiàn)時間自由還是不簡單的,多種時間格式容易混淆,本文為大家整理了一下GO中的時間操作,有需要的可以參考下
    2023-09-09
  • Golang標準庫之errors包應用方式

    Golang標準庫之errors包應用方式

    Go語言的errors包提供了基礎的錯誤處理能力,允許通過errors.New創(chuàng)建自定義error對象,error在Go中是一個接口,通過實現(xiàn)Error方法來定義錯誤文本,對錯誤的比較通?;趯ο蟮刂?而非文本內(nèi)容,因此即使兩個錯誤文本相同
    2024-10-10

最新評論

清水河县| 麻阳| 阜新市| 富蕴县| 东乌珠穆沁旗| 肇东市| 利津县| 延安市| 永善县| 永昌县| 紫金县| 鹿邑县| 夏邑县| 信宜市| 北碚区| 潮州市| 阳朔县| 乐陵市| 莆田市| 玉田县| 平武县| 磴口县| 安多县| 汤阴县| 门头沟区| 中宁县| 广丰县| 柏乡县| 浠水县| 安庆市| 通化县| 布拖县| 宣武区| 长垣县| 同德县| 绍兴市| 巴塘县| 将乐县| 岑溪市| 平罗县| 女性|