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

Go語(yǔ)言通過(guò)WaitGroup實(shí)現(xiàn)控制并發(fā)的示例詳解

 更新時(shí)間:2023年01月30日 10:51:37   作者:孫琦Ray  
Channel能夠很好的幫助我們控制并發(fā),但是在開(kāi)發(fā)習(xí)慣上與顯示的表達(dá)不太相同,所以在Go語(yǔ)言中可以利用sync包中的WaitGroup實(shí)現(xiàn)并發(fā)控制,本文就來(lái)和大家詳細(xì)聊聊WaitGroup如何實(shí)現(xiàn)控制并發(fā)

與Channel區(qū)別

Channel能夠很好的幫助我們控制并發(fā),但是在開(kāi)發(fā)習(xí)慣上與顯示的表達(dá)不太相同,所以在Go語(yǔ)言中可以利用sync包中的WaitGroup實(shí)現(xiàn)并發(fā)控制,更加直觀(guān)。

基本使用示例

我們將之前的示例加以改造,引入sync.WaitGroup來(lái)實(shí)現(xiàn)并發(fā)控制。

首先我們?cè)谥骱瘮?shù)中定義WaitGroup

var wg sync.WaitGroup

每執(zhí)行一個(gè)任務(wù),則調(diào)用Add()方法

wg.Add(1)

在主函數(shù)中我們利用Wait()方法等待并發(fā)結(jié)束

wg.Wait()

在調(diào)用的函數(shù)中,我們需要將WaitGroup以指針?lè)绞絺魅?,否則將造成Deadlock

// 主函數(shù)內(nèi)
go ready(5, &wg)

// 函數(shù)
func ready(s int, wg *sync.WaitGroup)

同時(shí)在函數(shù)執(zhí)行完成后,調(diào)用wg.Done,我們使用defer實(shí)現(xiàn)

defer wg.Done()

完整代碼

package main

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

func ready(s int, wg *sync.WaitGroup) {

    defer wg.Done()

    fmt.Printf("Run func in a goroutine and wait for %v\n", s)
    time.Sleep(time.Second * time.Duration(s))
    fmt.Printf("Run func in a goroutine and wait for %v end\n", s)
}

func main() {

    var wg sync.WaitGroup

    wg.Add(1)
    go ready(5, &wg)

    mainWaitSec := 2
    fmt.Printf("Run Main function and wait for %v\n", mainWaitSec)
    time.Sleep(time.Second * time.Duration(mainWaitSec))
    fmt.Printf("Run Main function and wait for %v done\n", mainWaitSec)

    wg.Wait()

}

特別提示

WaitGroup傳入給函數(shù)時(shí),需要以指針?lè)绞絺鬟f,否則會(huì)造成Deadlock

多任務(wù)示例

如果不想在函數(shù)中傳遞WaitGroup,也可以采用以下這種方式,通過(guò)并發(fā)匿名函數(shù)的方式,在主函數(shù)邏輯中對(duì)并發(fā)進(jìn)行精準(zhǔn)控制

    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        waitSec := i + 1
        go func() {
            defer wg.Done()
            ready(waitSec)
        }()
    }

完整代碼

package main

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

func ready(s int) {
    fmt.Printf("Run func in a goroutine and wait for %v\n", s)
    time.Sleep(time.Second * time.Duration(s))
    fmt.Printf("Run func in a goroutine and wait for %v end\n", s)
}

func main() {

    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)

        waitSec := i + 1
        go func() {
            defer wg.Done()
            ready(waitSec)
        }()
    }

    mainWaitSec := 2
    fmt.Printf("Run Main function and wait for %v\n", mainWaitSec)
    time.Sleep(time.Second * time.Duration(mainWaitSec))
    fmt.Printf("Run Main function and wait for %v done\n", mainWaitSec)

    wg.Wait()

}

運(yùn)行結(jié)果如下

Run Main function and wait for 2
Run func in a goroutine and wait for 2
Run func in a goroutine and wait for 4
Run func in a goroutine and wait for 5
Run func in a goroutine and wait for 1
Run func in a goroutine and wait for 3
Run func in a goroutine and wait for 1 end
Run Main function and wait for 2 done
Run func in a goroutine and wait for 2 end
Run func in a goroutine and wait for 3 end
Run func in a goroutine and wait for 4 end
Run func in a goroutine and wait for 5 end

到此這篇關(guān)于Go語(yǔ)言通過(guò)WaitGroup實(shí)現(xiàn)控制并發(fā)的示例詳解的文章就介紹到這了,更多相關(guān)Go語(yǔ)言 WaitGroup控制并發(fā)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語(yǔ)言制作的zip壓縮程序

    go語(yǔ)言制作的zip壓縮程序

    這篇文章主要介紹了go語(yǔ)言制作的zip壓縮程序,其主體思路是首先創(chuàng)建一個(gè)讀寫(xiě)緩沖,然后用壓縮器包裝該緩沖,用Walk方法來(lái)將所有目錄下的文件寫(xiě)入zip,有需要的小伙伴參考下。
    2015-03-03
  • go原生庫(kù)的中bytes.Buffer用法

    go原生庫(kù)的中bytes.Buffer用法

    這篇文章主要介紹了go原生庫(kù)的中bytes.Buffer用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Prometheus Go client library使用方式詳解

    Prometheus Go client library使用方式詳解

    這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 詳解Golang?ProtoBuf的基本語(yǔ)法總結(jié)

    詳解Golang?ProtoBuf的基本語(yǔ)法總結(jié)

    最近項(xiàng)目是采用微服務(wù)架構(gòu)開(kāi)發(fā)的,各服務(wù)之間通過(guò)gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會(huì)對(duì)Protobuf的語(yǔ)法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助
    2022-10-10
  • golang?手寫(xiě)貪吃蛇示例實(shí)現(xiàn)

    golang?手寫(xiě)貪吃蛇示例實(shí)現(xiàn)

    這篇文章主要為大家介紹了golang?手寫(xiě)貪吃蛇示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)

    Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以)

    這篇文章主要介紹了Goland激活碼破解永久版及安裝詳細(xì)教程(親測(cè)可以),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言中的并發(fā)模式你了解了嗎

    Go語(yǔ)言中的并發(fā)模式你了解了嗎

    工作中查看項(xiàng)目代碼,發(fā)現(xiàn)會(huì)存在使用?GO?語(yǔ)言做并發(fā)的時(shí)候出現(xiàn)各種各樣的異常情況,實(shí)際上,出現(xiàn)上述的情況,還是因?yàn)槲覀儗?duì)于?GO?語(yǔ)言的并發(fā)模型和涉及的?GO?語(yǔ)言基礎(chǔ)不夠扎實(shí),所以本文小編就來(lái)帶大家深入了解下Go語(yǔ)言中的并發(fā)模式吧
    2023-08-08
  • Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線(xiàn))

    Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線(xiàn))

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點(diǎn),別名與下劃線(xiàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Go語(yǔ)言操作Excel利器之excelize類(lèi)庫(kù)詳解

    Go語(yǔ)言操作Excel利器之excelize類(lèi)庫(kù)詳解

    Excelize是Go語(yǔ)言編寫(xiě)的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),可以使用它來(lái)讀取、寫(xiě)入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作Excel利器之excelize類(lèi)庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 使用golang開(kāi)發(fā)一個(gè)curl命令行工具

    使用golang開(kāi)發(fā)一個(gè)curl命令行工具

    這篇文章主要為大家詳細(xì)介紹了如何使用golang開(kāi)發(fā)一個(gè)簡(jiǎn)單的curl命令行工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11

最新評(píng)論