您好,登錄后才能下訂單哦!
Golang中的Goroutine如何理解,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
Go協程(Goroutine)是與其他函數同時運行的函數。可以認為Go協程是輕量級的線程,由Go運行時來管理。
在函數調用前加上go關鍵字,這次調用就會在一個新的goroutine中并發執行。當被調用的函數返回時,這個goroutine也自動結束。聽著感覺像C# 中的Task。
需要注意的是,如果這個函數有返回值,那么這個返回值會被丟棄。
Go 協程(Goroutine)之間通過信道(channel)進行通信,簡單的說就是多個協程之間通信的管道。信道可以防止多個協程訪問共享內存時發生資源爭搶的問題。
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(管道) 可以被認為是協程之間通信的管道。與水流從管道的一端流向另一端一樣,數據可以從信道的一端發送并在另一端接收。
1. 定義
每個channel都有一個類型。此類型是允許信道傳輸的數據類型。channel是類型相關的,一個channel只能傳遞一種類型的值,這個類型需要在聲明channel時指定。
2. 聲明
a. 我們需要通過內置函數 make
來創建一個信道。
下面的代碼聲明了一個信道:
var ch chan int
b. 與其他變量定義一樣,快速聲明也是定義信道的一種有效而簡潔的方式:
a := make(chan int)
c. 創建一個帶緩沖的channel
c := make(chan int, 1024)
// 從帶緩沖的channel中讀數據
for i:=range c {
...
}
3. 發送和接收數據
通過信道發送和接收數據的語法如下:
data := <- a // 從channel a 讀取數據 a <- data // 將數據寫入到 channel a
箭頭的指向說明了數據是發送還是接收,是不是特別簡單?
下面就直接說說,Goroutine和channel 共同使用的完整例子:
package main
import (
"fmt"
"time"
)
func Producer(queue chan<- int) {
for i := 0; i < 10; i++ {
queue <- i //寫入
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是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。