欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)

 更新時(shí)間:2023年01月07日 14:21:19   作者:北漂燕郊楊哥  
WaitGroup是Golang并發(fā)的兩種方式之一,一個(gè)是Channel,另一個(gè)是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下

一、前言

waitgroup在golang中,用于線(xiàn)程同步,指等待一個(gè)組,等待一個(gè)系列執(zhí)行完成后,才會(huì)向下執(zhí)行,可以解決一個(gè) 進(jìn)程goroutine 等待多個(gè)該進(jìn)程啟動(dòng)的子線(xiàn)程goroutine 都正常運(yùn)行完成的場(chǎng)景,這個(gè)比較常見(jiàn)的場(chǎng)景就是例如 后端 main processer 啟動(dòng)了多個(gè)消費(fèi)者worker干活,還有爬蟲(chóng)并發(fā)爬取數(shù)據(jù),多線(xiàn)程下載等等,為了保證主進(jìn)程在所有的子線(xiàn)程完成后再退出,這時(shí)就要用上waitgroup

二、waitgroup使用示例

我們這里模擬一個(gè) worker 的例子

package main

import (
    "fmt"
    "sync"
    "time"
)
func worker(idx int, out chan struct{}, wg *sync.WaitGroup) {
	 defer wg.Done()
        time.Sleep(1 * time.Second)
        fmt.Println(time.Now())
        fmt.Println(idx )
        <-out 
}
func main() {
    wg := new(sync.WaitGroup)
    in := make(chan struct{}, 20)
    for i := 0; i < 200; i++ {
        in <- struct{}{}
        wg.Add(1)
        go worker(i, in, wg)
    }
    wg.Wait()
}

在這段代碼中,main最后一行是

wg.Wait()

這行代碼保證有所的200個(gè)子線(xiàn)程全部都執(zhí)行完成后才會(huì)退出main函數(shù),如果沒(méi)有最后一行wg.Wait(),可能會(huì)出現(xiàn)for循環(huán)遍歷完程序就直接退出了,有可能只有不確定個(gè)幾個(gè)子線(xiàn)程執(zhí)行完成,其它線(xiàn)程由于主程序main退出后就直接退出了

從這個(gè)例子我們也可以看到 waitgroup通常配合來(lái)限制并發(fā)線(xiàn)程個(gè)數(shù)和確保所有的線(xiàn)程都最終都執(zhí)行完成
這段代碼中 ws 有三個(gè)緩沖,所以并發(fā)的數(shù)量是20,超過(guò)20個(gè)就要等待執(zhí)行完成釋放所占用通道后才能再開(kāi)新的線(xiàn)程

上面的代碼,會(huì)在執(zhí)行到wg.Wait()后等待,直到所有的200線(xiàn)程全部執(zhí)行完后才會(huì)繼續(xù)往下執(zhí)行

可以説這段代碼非常精妙,示例代碼執(zhí)行結(jié)果如下:

同時(shí)我們也可以測(cè)試一下把最后一行

//wg.Wait()

注釋掉,我們看一下程序會(huì)怎么執(zhí)行

注釋后,我們看到程序完成時(shí),只有171個(gè)線(xiàn)程完成運(yùn)行,剩下的20幾個(gè)線(xiàn)程異常結(jié)束了,看不到任何返回結(jié)果

三、waitgroup使用注意事項(xiàng)

同時(shí)我們?cè)谑褂脀aitgroup時(shí)也要注意一些坑:

1、 Add一個(gè)負(fù)數(shù)

如果計(jì)數(shù)器的值小于0會(huì)直接panic

2、 Add在Wait之后調(diào)用

比如一些子協(xié)程開(kāi)頭調(diào)用Add結(jié)束調(diào)用Wait,這些 Wait無(wú)法阻塞子協(xié)程。正確做法是在開(kāi)啟子協(xié)程之前先Add特定的值。

3、 未置為0就重用

WaitGroup可以完成一次編排任務(wù),計(jì)數(shù)值降為0后可以繼續(xù)被其他任務(wù)所用,但是不要在還沒(méi)使用完的時(shí)候就用于其他任務(wù),這樣由于帶著計(jì)數(shù)值,很可能出問(wèn)題。

4、 復(fù)制waitgroup

WaitGroup有nocopy字段,不能被復(fù)制。也意味著WaitGroup不能作為函數(shù)的參數(shù)

四、waitgroup使用總結(jié)

WaitGroup是Golang應(yīng)用開(kāi)發(fā)過(guò)程中經(jīng)常使用的并發(fā)控制技術(shù),學(xué)習(xí)golang是我們必須要掌握和理解的機(jī)制之一,建議有時(shí)間了大家再進(jìn)一步的研究一下WaitGroup的底層實(shí)現(xiàn)邏輯。

附:陷阱避免

1)WaitGroup 同步的是 goroutine, 如果在 goroutine 中進(jìn)行 Add(1) 操作,可能在這些 goroutine 還沒(méi)來(lái)得及 Add(1) 已經(jīng)執(zhí)行 Wait 操作,造成程序退出。

2)WaitGroup 傳遞給goroutine的時(shí)候,應(yīng)該采用引用方式,從而避免發(fā)生副本拷貝而死鎖。

總結(jié)

到此這篇關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的文章就介紹到這了,更多相關(guān)golang waitgroup用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言遍歷map實(shí)現(xiàn)(訪(fǎng)問(wèn)map中的每一個(gè)鍵值對(duì))

    Go語(yǔ)言遍歷map實(shí)現(xiàn)(訪(fǎng)問(wèn)map中的每一個(gè)鍵值對(duì))

    這篇文章主要介紹了Go語(yǔ)言遍歷map實(shí)現(xiàn)(訪(fǎng)問(wèn)map中的每一個(gè)鍵值對(duì)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • GO語(yǔ)言基本數(shù)據(jù)類(lèi)型總結(jié)

    GO語(yǔ)言基本數(shù)據(jù)類(lèi)型總結(jié)

    這篇文章主要介紹了GO語(yǔ)言基本數(shù)據(jù)類(lèi)型,較為詳細(xì)的總結(jié)了GO語(yǔ)言的基本數(shù)據(jù)類(lèi)型,對(duì)于GO語(yǔ)言的學(xué)習(xí)有一定的借鑒參考價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 淺談Go語(yǔ)言多態(tài)的實(shí)現(xiàn)與interface使用

    淺談Go語(yǔ)言多態(tài)的實(shí)現(xiàn)與interface使用

    如果大家系統(tǒng)的學(xué)過(guò)C++、Java等語(yǔ)言以及面向?qū)ο蟮脑?huà),相信應(yīng)該對(duì)多態(tài)不會(huì)陌生。多態(tài)是面向?qū)ο蠓懂牣?dāng)中經(jīng)常使用并且非常好用的一個(gè)功能,它主要是用在強(qiáng)類(lèi)型語(yǔ)言當(dāng)中,像是Python這樣的弱類(lèi)型語(yǔ)言,變量的類(lèi)型可以隨意變化,也沒(méi)有任何限制,其實(shí)區(qū)別不是很大
    2021-06-06
  • Go語(yǔ)言中日志的規(guī)范使用建議分享

    Go語(yǔ)言中日志的規(guī)范使用建議分享

    在任何服務(wù)端的語(yǔ)言項(xiàng)目中,日志是至關(guān)重要的組成部分,本文為大家整理了一些如何規(guī)范使用GO語(yǔ)言日志的建議,以及相應(yīng)的實(shí)際示例,希望對(duì)大家有事幫助
    2024-01-01
  • Golang二維數(shù)組的使用方式

    Golang二維數(shù)組的使用方式

    之前給大家講過(guò)很多二維數(shù)組的知識(shí),今天重點(diǎn)給大家介紹Golang二維數(shù)組的使用方式,通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-05-05
  • golang 自旋鎖的實(shí)現(xiàn)

    golang 自旋鎖的實(shí)現(xiàn)

    這篇文章主要介紹了golang 自旋鎖的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Go語(yǔ)言包管理模式示例分析

    Go語(yǔ)言包管理模式示例分析

    這篇文章主要為大家介紹了Go語(yǔ)言包管理模式示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Golang如何讀取單行超長(zhǎng)的文本詳解

    Golang如何讀取單行超長(zhǎng)的文本詳解

    這篇文章主要給大家介紹了關(guān)于Golang如何讀取單行超長(zhǎng)文本的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 基于Go語(yǔ)言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程

    基于Go語(yǔ)言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程

    Go 是一個(gè)開(kāi)源的編程語(yǔ)言,它能讓構(gòu)造簡(jiǎn)單、可靠且高效的軟件變得容易,本文給大家介紹了基于Go語(yǔ)言搭建靜態(tài)文件服務(wù)器的詳細(xì)教程,文中通過(guò)圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Go語(yǔ)言基礎(chǔ)模板設(shè)計(jì)模式示例詳解

    Go語(yǔ)言基礎(chǔ)模板設(shè)計(jì)模式示例詳解

    這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)設(shè)計(jì)模式之模板模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11

最新評(píng)論