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

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

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

與Channel區(qū)別

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

基本使用示例

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

首先我們在主函數(shù)中定義WaitGroup

var wg sync.WaitGroup

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

wg.Add(1)

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

wg.Wait()

在調(diào)用的函數(shù)中,我們需要將WaitGroup以指針方式傳入,否則將造成Deadlock

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

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

同時在函數(shù)執(zhí)行完成后,調(diào)用wg.Done,我們使用defer實現(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ù)時,需要以指針方式傳遞,否則會造成Deadlock

多任務示例

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

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

}

運行結果如下

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

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

相關文章

  • Golang TCP粘包拆包問題的解決方法

    Golang TCP粘包拆包問題的解決方法

    這篇文章主要給大家介紹了Golang TCP粘包拆包問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Golang具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • Go語言中的Slice學習總結

    Go語言中的Slice學習總結

    這篇文章主要介紹了Go語言中的Slice學習總結,本文講解了Slice的定義、Slice的長度和容量、Slice是引用類型、Slice引用傳遞發(fā)生“意外”等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • 解析Go語言編程中的struct結構

    解析Go語言編程中的struct結構

    這篇文章主要介紹了Go語言編程中的struct結構,是Go語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-10-10
  • Golang?urfave/cli庫簡單應用示例詳解

    Golang?urfave/cli庫簡單應用示例詳解

    這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang RSA生成密鑰、加密、解密、簽名與驗簽的實現(xiàn)

    Golang RSA生成密鑰、加密、解密、簽名與驗簽的實現(xiàn)

    RSA 是最常用的非對稱加密算法,本文主要介紹了Golang RSA生成密鑰、加密、解密、簽名與驗簽的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • golang?metrics各個指標含義講解說明

    golang?metrics各個指標含義講解說明

    這篇文章主要為大家介紹了golang?metrics各個指標含義講解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Go語言開發(fā)代碼自測絕佳go?fuzzing用法詳解

    Go語言開發(fā)代碼自測絕佳go?fuzzing用法詳解

    這篇文章主要為大家介紹了Go語言開發(fā)代碼自測絕佳go?fuzzing用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Go語言每天必學之switch語句

    Go語言每天必學之switch語句

    這篇文章主要為大家詳細介紹了Go語言每天必學之switch語句的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • go使用makefile腳本編譯應用的方法小結

    go使用makefile腳本編譯應用的方法小結

    makefile可以看作是make工具的腳本文件, 而make主要用來處理一系列命令。常用的比如用來編譯和打包文件, 在C/C++的編譯打包中應用最廣泛了,這篇文章主要介紹了go使用makefile腳本編譯應用,需要的朋友可以參考下
    2022-08-08
  • 一文初探Go語言中的reflect反射包

    一文初探Go語言中的reflect反射包

    這篇文章主要和大家分享一下Go語言中的reflect反射包,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12

最新評論

云林县| 定日县| 桐柏县| 阿荣旗| 定边县| 基隆市| 阳信县| 弥渡县| 伊通| 惠安县| 丁青县| 临汾市| 廊坊市| 翼城县| 太谷县| 大安市| 抚顺县| 新宾| 杭锦后旗| 嘉兴市| 南平市| 永泰县| 大同市| 班玛县| 斗六市| 资源县| 资兴市| 古田县| 灯塔市| 温宿县| 仲巴县| 婺源县| 积石山| 夏津县| 屏南县| 承德市| 邵东县| 阜城县| 分宜县| 陇南市| 金堂县|