溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Golang中的Goroutine如何理解

發(fā)布時(shí)間:2022-01-17 16:32:11 來(lái)源:億速云 閱讀:155 作者:kk 欄目:大數(shù)據(jù)

Golang中的Goroutine如何理解,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

什么是Go協(xié)程

Go協(xié)程(Goroutine)是與其他函數(shù)同時(shí)運(yùn)行的函數(shù)??梢哉J(rèn)為Go協(xié)程是輕量級(jí)的線程,由Go運(yùn)行時(shí)來(lái)管理。

在函數(shù)調(diào)用前加上go關(guān)鍵字,這次調(diào)用就會(huì)在一個(gè)新的goroutine中并發(fā)執(zhí)行。當(dāng)被調(diào)用的函數(shù)返回時(shí),這個(gè)goroutine也自動(dòng)結(jié)束。聽(tīng)著感覺(jué)像C# 中的Task。

需要注意的是,如果這個(gè)函數(shù)有返回值,那么這個(gè)返回值會(huì)被丟棄。

Golang中的Goroutine如何理解

Go 協(xié)程(Goroutine)之間通過(guò)信道(channel)進(jìn)行通信,簡(jiǎn)單的說(shuō)就是多個(gè)協(xié)程之間通信的管道。信道可以防止多個(gè)協(xié)程訪問(wèn)共享內(nèi)存時(shí)發(fā)生資源爭(zhēng)搶的問(wèn)題。

如何使用

package main
import (      "fmt"    "time")
func hello() {      fmt.Println("Hello world goroutine")}func main() {      go hello()    time.Sleep(1 * time.Second)    fmt.Println("main function")}

Channel(管道)

Channel(管道) 可以被認(rèn)為是協(xié)程之間通信的管道。與水流從管道的一端流向另一端一樣,數(shù)據(jù)可以從信道的一端發(fā)送并在另一端接收。

1. 定義

每個(gè)channel都有一個(gè)類型。此類型是允許信道傳輸?shù)臄?shù)據(jù)類型。channel是類型相關(guān)的,一個(gè)channel只能傳遞一種類型的值,這個(gè)類型需要在聲明channel時(shí)指定。

 

2. 聲明

a. 我們需要通過(guò)內(nèi)置函數(shù) make 來(lái)創(chuàng)建一個(gè)信道。

下面的代碼聲明了一個(gè)信道:

var ch chan int

b. 與其他變量定義一樣,快速聲明也是定義信道的一種有效而簡(jiǎn)潔的方式:

a := make(chan int)

c. 創(chuàng)建一個(gè)帶緩沖的channel

c := make(chan int, 1024)
// 從帶緩沖的channel中讀數(shù)據(jù)for i:=range c {  ...}

3. 發(fā)送和接收數(shù)據(jù)

通過(guò)信道發(fā)送和接收數(shù)據(jù)的語(yǔ)法如下:

data := <- a   // 從channel a 讀取數(shù)據(jù) a <- data      // 將數(shù)據(jù)寫(xiě)入到 channel a

箭頭的指向說(shuō)明了數(shù)據(jù)是發(fā)送還是接收,是不是特別簡(jiǎn)單?

完整例子

下面就直接說(shuō)說(shuō),Goroutine和channel 共同使用的完整例子:

package main
import (    "fmt"    "time")
func Producer(queue chan<- int) {    for i := 0; i < 10; i++ {        queue <- i //寫(xiě)入        fmt.Println("create :", i)    }}
func Consumer(queue <-chan int) {    for i := 0; i < 10; i++ {        v := <-queue  // 讀出        fmt.Println("receive:", v)    }}
func main() {    queue := make(chan int, 88)    go Producer(queue)    go Consumer(queue)    time.Sleep(1 * time.Second)}

golang的優(yōu)點(diǎn)

golang是一種編譯語(yǔ)言,可以將代碼編譯為機(jī)器代碼,編譯后的二進(jìn)制文件可以直接部署到目標(biāo)機(jī)器而無(wú)需額外的依賴,所以golang的性能優(yōu)于其他的解釋性語(yǔ)言,且可以在golang中使用goroutine來(lái)實(shí)現(xiàn)并發(fā)性,它提供了一個(gè)非常優(yōu)雅的goroutine調(diào)度程序系統(tǒng),可以很容易地生成數(shù)百萬(wàn)個(gè)goroutine。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI