亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺析Golang中的協(xié)程(goroutine)

 更新時(shí)間:2023年05月22日 09:16:46   作者:周小末天天開心  
在Go語(yǔ)言中,協(xié)程(goroutine)是輕量級(jí)的線程,它是Go語(yǔ)言中實(shí)現(xiàn)并發(fā)編程的基礎(chǔ),Go語(yǔ)言中的協(xié)程是由Go運(yùn)行時(shí)調(diào)度器(scheduler)進(jìn)行管理和調(diào)度的,本文將給大家簡(jiǎn)單的介紹一下Golang中的協(xié)程,需要的朋友可以參考下

進(jìn)程

進(jìn)程就是程序在操作系統(tǒng)中的一次執(zhí)行過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,進(jìn)程是一個(gè)動(dòng)態(tài)概念,是程序在執(zhí)行過程中分配和管理資源的基本單位,每一個(gè)進(jìn)程都有一個(gè)自己的地址空間。一個(gè)進(jìn)程至少有5種基本狀態(tài):初始狀態(tài),執(zhí)行狀態(tài),等待狀態(tài),就緒狀態(tài),終止?fàn)顟B(tài)。通俗的講,進(jìn)程就是一個(gè)正在執(zhí)行的程序。

線程

線程是進(jìn)程的一個(gè)執(zhí)行實(shí)例,是程序執(zhí)行的最小單元,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。一個(gè)進(jìn)程可以創(chuàng)建多個(gè)線程,同一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)執(zhí)行,一個(gè)程序要運(yùn)行的話至少有一個(gè)進(jìn)程。

并發(fā)

并發(fā)是指在同一時(shí)間段內(nèi)處理多個(gè)任務(wù),通過多個(gè)任務(wù)之間的切換,使得在表面上看來(lái)是同時(shí)進(jìn)行的。在 Go 語(yǔ)言中,可以使用 goroutine 和 channel 實(shí)現(xiàn)并發(fā)編程。

特點(diǎn):

  • 多個(gè)任務(wù)作用在一個(gè)CPU上面

  • 同一時(shí)間點(diǎn)只能有一個(gè)任務(wù)執(zhí)行

  • 同一時(shí)間段內(nèi)執(zhí)行多個(gè)任務(wù)

并行

并行是指同時(shí)處理多個(gè)任務(wù),即多個(gè)任務(wù)同時(shí)在不同的處理器上進(jìn)行執(zhí)行。并行可以顯著提高程序的性能,特別是在多核 CPU 中,能夠利用多個(gè) CPU 核心進(jìn)行計(jì)算。在 Go 語(yǔ)言中,可以使用 goroutine 和 runtime 包的 GOMAXPROCS 函數(shù)實(shí)現(xiàn)并行編程。

特點(diǎn):

  • 多個(gè)任務(wù)作用在多個(gè)CPU上面

  • 同一時(shí)刻執(zhí)行多個(gè)任務(wù)

通俗的講,多線程程序在單核CPU上面運(yùn)行就是并發(fā),多線程程序在多核CUP上運(yùn)行就是并行,如果線程數(shù)大于CPU核數(shù),則多線程程序在多個(gè)CPU上面運(yùn)行既有并行也有并發(fā)。

協(xié)程(goroutine)

在 Go 語(yǔ)言中,協(xié)程(goroutine)是輕量級(jí)的線程,它是 Go 語(yǔ)言中實(shí)現(xiàn)并發(fā)編程的基礎(chǔ)。與傳統(tǒng)的線程相比,協(xié)程的創(chuàng)建和切換都非常輕量級(jí),可以在單個(gè)線程內(nèi)創(chuàng)建成千上萬(wàn)個(gè)協(xié)程,且切換開銷非常小,因此可以實(shí)現(xiàn)高效的并發(fā)編程。

Go 語(yǔ)言中的協(xié)程是由 Go 運(yùn)行時(shí)調(diào)度器(scheduler)進(jìn)行管理和調(diào)度的。當(dāng)程序啟動(dòng)時(shí),Go 運(yùn)行時(shí)會(huì)默認(rèn)啟動(dòng)一個(gè)主協(xié)程,主協(xié)程會(huì)創(chuàng)建其他的子協(xié)程,這些協(xié)程會(huì)被分配到不同的系統(tǒng)線程上進(jìn)行執(zhí)行。當(dāng)某個(gè)協(xié)程發(fā)生阻塞時(shí),Go 運(yùn)行時(shí)會(huì)將該協(xié)程掛起并讓出 CPU,轉(zhuǎn)而執(zhí)行其他協(xié)程,以充分利用系統(tǒng)資源。

在 Go 語(yǔ)言中,創(chuàng)建協(xié)程非常簡(jiǎn)單,只需要在函數(shù)調(diào)用前加上 go 關(guān)鍵字即可。

例如:

func main() {
    go func() {
        fmt.Println("Hello, world!")
    }()
}

使用sync.WaitGroup等待協(xié)程執(zhí)行完畢

func test1() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒輸出一次
 
        fmt.Println("test1() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //協(xié)程計(jì)數(shù)器加-1
 
}
 
func main() {
    //注意:
 
    //1.主線程執(zhí)行完畢后即使協(xié)程沒有執(zhí)行完畢程序也會(huì)退出
 
    //2.協(xié)程可以在主線程沒有執(zhí)行完畢前提前退出,協(xié)程是否執(zhí)行完畢不會(huì)影響主線程的執(zhí)行
 
    //為了保證我們的程序可以順利執(zhí)行,我們想讓協(xié)程執(zhí)行完畢后再執(zhí)行主進(jìn)程退出,
 
    //這個(gè)時(shí)候我們可以使用sync.WaitGroup等待協(xié)程執(zhí)行完畢
 
    wg.Add(1)  //協(xié)程計(jì)數(shù)器加1
 
    go test1() //表示開啟一個(gè)協(xié)程
 
    for i := 0; i < 10; i++ {
 
        //每50毫秒輸出一次
 
        fmt.Println("mian() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 50)
 
    }
 
    wg.Wait() //等待協(xié)程執(zhí)行完畢
 
    fmt.Println("主線程退出。。。")
}

多協(xié)程和多線程

Golang中每個(gè)goroutine(協(xié)程)默認(rèn)占用內(nèi)存比Java、C的線程少。OS線程(操作系統(tǒng)線程)一般都有固定的棧內(nèi)存(通常為2MB左右),一個(gè)goroutine(協(xié)程)占用內(nèi)存非常少,只有2KB左右,多協(xié)程切換調(diào)度開銷方面遠(yuǎn)比線程要少。這也是為什么越來(lái)越多的大公司使用Golang的原因之一。

func test1() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒輸出一次
 
        fmt.Println("test1() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //協(xié)程計(jì)數(shù)器加-1
 
}
 
func test2() {
 
    for i := 0; i < 10; i++ {
 
        //每100毫秒輸出一次
 
        fmt.Println("test2() 你好Golang-", i)
 
        time.Sleep(time.Millisecond * 100)
 
    }
 
    wg.Done() //協(xié)程計(jì)數(shù)器加-1
 
}
 
func main() {
    wg.Add(1)  //協(xié)程計(jì)數(shù)器加1
 
    go test1() //表示開啟一個(gè)協(xié)程
 
    wg.Add(1)  //協(xié)程計(jì)數(shù)器加1
 
    go test2() //表示開啟一個(gè)協(xié)程
 
    wg.Wait()
 
    fmt.Println("主程序退出。。。")
}

以上就是淺析Golang中的協(xié)程(goroutine)的詳細(xì)內(nèi)容,更多關(guān)于Golang 協(xié)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go語(yǔ)言切片擴(kuò)容原理和過程

    Go語(yǔ)言切片擴(kuò)容原理和過程

    切片(Slice)在 Go 語(yǔ)言中,有一個(gè)很常用的數(shù)據(jù)結(jié)構(gòu),切片是一個(gè)擁有相同類型元素的可變長(zhǎng)度的序列,它是基于數(shù)組類型做的一層封裝,它非常靈活,支持自動(dòng)擴(kuò)容,并發(fā)不安全,本文給大家介紹了Go 語(yǔ)言切片如何擴(kuò)容,需要的朋友可以參考下
    2025-02-02
  • golang-gorm自動(dòng)建表問題

    golang-gorm自動(dòng)建表問題

    這篇文章主要介紹了golang-gorm自動(dòng)建表問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索

    go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索

    這篇文章主要為大家介紹了go語(yǔ)言編程學(xué)習(xí)實(shí)現(xiàn)圖的廣度與深度優(yōu)先搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • Go 1.22中的for循環(huán)新特性詳解

    Go 1.22中的for循環(huán)新特性詳解

    在 Go 語(yǔ)言中,for 循環(huán)是實(shí)現(xiàn)迭代的主要方式,Go 中的 for 循環(huán)非常靈活,有多種使用方式,本文將給大家詳細(xì)的介紹一下Go 1.22中的for循環(huán)新特性,感興趣的朋友可以參考下
    2024-02-02
  • 通過源碼分析Golang?cron的實(shí)現(xiàn)原理

    通過源碼分析Golang?cron的實(shí)現(xiàn)原理

    golang實(shí)現(xiàn)定時(shí)任務(wù)很簡(jiǎn)單,只須要簡(jiǎn)單幾步代碼即可以完成,最近在做了幾個(gè)定時(shí)任務(wù),想研究一下它內(nèi)部是怎么實(shí)現(xiàn)的,所以將源碼過了一遍,記錄和分享在此。需要的朋友可以參考以下內(nèi)容,希望對(duì)大家有幫助
    2022-10-10
  • 教你利用Golang可選參數(shù)實(shí)現(xiàn)可選模式

    教你利用Golang可選參數(shù)實(shí)現(xiàn)可選模式

    本文討論Golang函數(shù)可選參數(shù)及函數(shù)類型,以及如何利用可選函數(shù)類型實(shí)現(xiàn)可選模式。同時(shí)通過構(gòu)造函數(shù)作為示例,實(shí)現(xiàn)強(qiáng)大帶可選參數(shù)的構(gòu)造函數(shù),讓代碼更直觀、靈活、支持?jǐn)U展
    2023-01-01
  • go語(yǔ)言的初始化順序,包,變量,init詳解

    go語(yǔ)言的初始化順序,包,變量,init詳解

    這篇文章主要介紹了go語(yǔ)言的初始化順序,包,變量,init詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-12-12
  • Go語(yǔ)言中的自定義類型你了解嗎

    Go語(yǔ)言中的自定義類型你了解嗎

    自定義類型是 Go 語(yǔ)言中非常重要的概念之一,通過自定義類型,我們可以更好地封裝數(shù)據(jù)、組織代碼,提高程序的可讀性和可維護(hù)性。本文將從以下幾個(gè)方面介紹 Go 自定義類型的相關(guān)知識(shí),感興趣的可以了解一下
    2023-04-04
  • Go語(yǔ)言擴(kuò)展原語(yǔ)之ErrGroup的用法詳解

    Go語(yǔ)言擴(kuò)展原語(yǔ)之ErrGroup的用法詳解

    除標(biāo)準(zhǔn)庫(kù)中提供的同步原語(yǔ)外,Go語(yǔ)言還在子倉(cāng)庫(kù)sync中提供了4種擴(kuò)展原語(yǔ),本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下
    2023-07-07
  • Golang學(xué)習(xí)筆記(五):函數(shù)

    Golang學(xué)習(xí)筆記(五):函數(shù)

    這篇文章主要介紹了Golang學(xué)習(xí)筆記(五):函數(shù)的相關(guān)資料,本文講解了基本語(yǔ)法、多返回值及命名返回參數(shù)、參數(shù)傳遞:傳值與傳指針、參數(shù)傳遞:可變參數(shù)、匿名函數(shù)、函數(shù)作為值、類型等內(nèi)容,需要的朋友可以參考下
    2015-05-05

最新評(píng)論