您好,登錄后才能下訂單哦!
Golang中的Goroutine如何理解,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
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ì)被丟棄。
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(管道) 可以被認(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ǔ)言,可以將代碼編譯為機(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ì)億速云的支持。
免責(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)容。