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

Go語(yǔ)言中g(shù)oroutine的使用

 更新時(shí)間:2023年06月28日 11:24:46   作者:碼一行  
本文主要介紹了Go語(yǔ)言中g(shù)oroutine的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、什么是 Goroutine ?

java/c++中我們要實(shí)現(xiàn)并發(fā)編程的時(shí)候,我們通常需要自己維護(hù)一個(gè)線程池,并且需要自己去包裝一個(gè)又一個(gè)的任務(wù),同時(shí)需要自己去調(diào)度線程執(zhí)行任務(wù)并維護(hù)上下文切換,這一切通常會(huì)耗費(fèi)程序員大量的心智。那么能不能有一種機(jī)制,程序員只需要定義很多個(gè)任務(wù),讓系統(tǒng)去幫助我們把這些任務(wù)分配到CPU上實(shí)現(xiàn)并發(fā)執(zhí)行呢?

Go語(yǔ)言中的goroutine就是這樣一種機(jī)制,goroutine的概念類似于線程,但 goroutine是由Go的運(yùn)行時(shí)(runtime)調(diào)度和管理的。Go程序會(huì)智能地將 goroutine 中的任務(wù)合理地分配給每個(gè)CPU。Go語(yǔ)言之所以被稱為現(xiàn)代化的編程語(yǔ)言,就是因?yàn)樗谡Z(yǔ)言層面已經(jīng)內(nèi)置了調(diào)度和上下文切換的機(jī)制。

Go語(yǔ)言編程中你不需要去自己寫進(jìn)程、線程、協(xié)程,你的技能包里只有一個(gè)技能–goroutine,當(dāng)你需要讓某個(gè)任務(wù)并發(fā)執(zhí)行的時(shí)候,你只需要把這個(gè)任務(wù)包裝成一個(gè)函數(shù),開(kāi)啟一個(gè)goroutine去執(zhí)行這個(gè)函數(shù)就可以了,就是這么簡(jiǎn)單粗暴。

二、使用 Goroutine

Go語(yǔ)言中使用goroutine非常簡(jiǎn)單,只需要在調(diào)用函數(shù)的時(shí)候在前面加上go關(guān)鍵字,就可以為一個(gè)函數(shù)創(chuàng)建一個(gè)goroutine

一個(gè)goroutine必定對(duì)應(yīng)一個(gè)函數(shù),可以創(chuàng)建多個(gè)goroutine去執(zhí)行相同的函數(shù)。

單個(gè) goroutine

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello()
    fmt.Println("main goroutine done!")
}

執(zhí)行這段程序:

main goroutine done! 

那么問(wèn)題來(lái)了:為什么 Hello Goroutine! 沒(méi)有輸出呢?

在程序啟動(dòng)時(shí),Go程序就會(huì)為main()函數(shù)創(chuàng)建一個(gè)默認(rèn)的goroutine

當(dāng)main()函數(shù)返回的時(shí)候該goroutine就結(jié)束了,所以在main()函數(shù)中啟動(dòng)的goroutine會(huì)一同結(jié)束,main函數(shù)所在的goroutine就像是權(quán)利的游戲中的夜王,其他的goroutine都是異鬼,夜王一死它轉(zhuǎn)化的那些異鬼也就全部GG了。

所以咱們要想辦法讓main函數(shù)等一等hello函數(shù),最簡(jiǎn)單粗暴的方式就是time.Sleep了。

示例:

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello()
    fmt.Println("main goroutine done!")
    time.Sleep(time.Second) // 等待1秒
}

執(zhí)行這段程序:

Hello Goroutine!
main goroutine done!

多個(gè) goroutine

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func word() {
    fmt.Println("Word Goroutine!")
}
func main() {
    go hello()
    go word()
    fmt.Println("main goroutine done!")
    time.Sleep(2 * time.Second) // 等待2秒
}

執(zhí)行這段程序:

Hello Goroutine!
Word Goroutine!
main goroutine done!

開(kāi)啟多個(gè) goroutine 只需要再使用一次go關(guān)鍵字就可以了。

同樣的,咱們?yōu)榱俗屗軌蛲暾敵觯褂?time.Sleepmain函數(shù)等待 goroutine 執(zhí)行完成。

sync.WaitGroup 的使用

上面咱們講了如何開(kāi)啟goroutine,為了goroutine正常輸出,增加了 time.Sleep 等待。

但在我們實(shí)際項(xiàng)目開(kāi)發(fā)中,生硬的使用time.Sleep肯定是不合適的。那我們應(yīng)該如何才能正確優(yōu)雅的讓 main 函數(shù)等待 goroutine 執(zhí)行完之后再執(zhí)行呢?

go語(yǔ)言提供了一個(gè) sync.WaitGroup 的一個(gè)計(jì)數(shù)器的功能。可以用來(lái)優(yōu)雅的實(shí)現(xiàn) goroutine 的正常執(zhí)行和 main 函數(shù)的等待。

示例:

package main 
import (
    "fmt"
    "sync"
)
var wg sync.WaitGroup
func hello(){
    defer wg.done()  // 計(jì)數(shù)器 - 1
    fmt.Println("Hello Goroutine!")
}
func main(){
    wg.Add(1)  // 計(jì)數(shù)器 + 1
    go hello()
    wg.wait()  // 阻塞直到計(jì)數(shù)器變?yōu)?
    fmt.Println("main goroutine done!")
}

執(zhí)行這段程序:

Hello Goroutine!
main goroutine done!

方法名功能
(wg * WaitGroup) Add(delta int)計(jì)數(shù)器+delta
(wg *WaitGroup) Done()計(jì)數(shù)器-1
(wg *WaitGroup) Wait()阻塞直到計(jì)數(shù)器變?yōu)?

sync.WaitGroup內(nèi)部維護(hù)著一個(gè)計(jì)數(shù)器,計(jì)數(shù)器的值可以增加和減少。例如當(dāng)我們啟動(dòng)了 N 個(gè)并發(fā)任務(wù)時(shí),就將計(jì)數(shù)器值增加N。每個(gè)任務(wù)完成時(shí)通過(guò)調(diào)用Done()方法將計(jì)數(shù)器減1。通過(guò)調(diào)用Wait()來(lái)等待并發(fā)任務(wù)執(zhí)行完,當(dāng)計(jì)數(shù)器值為0時(shí),表示所有并發(fā)任務(wù)已經(jīng)完成。

在實(shí)際項(xiàng)目中使用sync.WaitGroup 可以更好的、更優(yōu)雅的控制goroutine。

三. 結(jié)束語(yǔ)

到此這篇關(guān)于Go語(yǔ)言中g(shù)oroutine的使用的文章就介紹到這了,更多相關(guān)Go語(yǔ)言goroutine內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • VsCode搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境的配置教程

    VsCode搭建Go語(yǔ)言開(kāi)發(fā)環(huán)境的配置教程

    這篇文章主要介紹了在VsCode中搭建Go開(kāi)發(fā)環(huán)境的配置教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Go語(yǔ)言中 Channel 詳解

    Go語(yǔ)言中 Channel 詳解

    Go 語(yǔ)言中的 channel 是實(shí)現(xiàn) goroutine 間無(wú)鎖通信的關(guān)鍵機(jī)制,他使得寫多線程并發(fā)程序變得簡(jiǎn)單、靈活、觸手可得。下面就個(gè)人理解對(duì) channel 使用過(guò)程中應(yīng)該注意的地方進(jìn)行一個(gè)簡(jiǎn)要的總結(jié)。
    2018-10-10
  • go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法

    go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法

    這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)猜數(shù)字小游戲的方法,實(shí)例分析了Go語(yǔ)言流程判斷與處理的技巧,需要的朋友可以參考下
    2015-03-03
  • go 迭代string數(shù)組操作 go for string[]

    go 迭代string數(shù)組操作 go for string[]

    這篇文章主要介紹了go 迭代string數(shù)組操作 go for string[],具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言中的圖形界面開(kāi)發(fā)從GUI到WebAssembly示例詳解

    Go語(yǔ)言中的圖形界面開(kāi)發(fā)從GUI到WebAssembly示例詳解

    圖形界面是現(xiàn)代應(yīng)用的重要組成部分,它為用戶提供了直觀、交互性強(qiáng)的操作方式,這篇文章主要介紹了Go語(yǔ)言中圖形界面開(kāi)發(fā)從GUI到WebAssembly的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • Golang通過(guò)SSH執(zhí)行交換機(jī)操作實(shí)現(xiàn)

    Golang通過(guò)SSH執(zhí)行交換機(jī)操作實(shí)現(xiàn)

    這篇文章主要介紹了Golang通過(guò)SSH執(zhí)行交換機(jī)操作實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • golang 如何實(shí)現(xiàn)HTTP代理和反向代理

    golang 如何實(shí)現(xiàn)HTTP代理和反向代理

    這篇文章主要介紹了golang 實(shí)現(xiàn)HTTP代理和反向代理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • GO中GORM 使用教程

    GO中GORM 使用教程

    GORM是Go語(yǔ)言的ORM庫(kù),它將關(guān)系型數(shù)據(jù)庫(kù)表與Go語(yǔ)言結(jié)構(gòu)體映射,提供便捷的數(shù)據(jù)庫(kù)操作,本文就來(lái)介紹有下GO中GORM 使用教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • go語(yǔ)言開(kāi)發(fā)環(huán)境配置(sublime text3+gosublime)

    go語(yǔ)言開(kāi)發(fā)環(huán)境配置(sublime text3+gosublime)

    網(wǎng)上google了下go的開(kāi)發(fā)工具,大都推薦sublime text3+gosublime,本文就介紹了go語(yǔ)言開(kāi)發(fā)環(huán)境配置(sublime text3+gosublime),具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • GoLang jwt無(wú)感刷新與SSO單點(diǎn)登錄限制解除方法詳解

    GoLang jwt無(wú)感刷新與SSO單點(diǎn)登錄限制解除方法詳解

    這篇文章主要介紹了GoLang jwt無(wú)感刷新與SSO單點(diǎn)登錄限制解除方法,JWT是一個(gè)簽名的JSON對(duì)象,通常用作Oauth2的Bearer token,JWT包括三個(gè)用.分割的部分。本文將利用JWT進(jìn)行認(rèn)證和加密,感興趣的可以了解一下
    2023-03-03

最新評(píng)論

潞西市| 长乐市| 汉寿县| 辽宁省| 霍邱县| 衡阳市| 叙永县| 明光市| 辽宁省| 尚义县| 大新县| 运城市| 泸州市| 莱芜市| 石家庄市| 鹤峰县| 南皮县| 凤山市| 信宜市| 灯塔市| 塘沽区| 吴江市| 什邡市| 台江县| 天祝| 徐州市| 青阳县| 郧西县| 兴文县| 昂仁县| 达拉特旗| 湖南省| 麻城市| 登封市| 潼南县| 遂宁市| 德州市| 舞阳县| 清水河县| 双牌县| 常宁市|