中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang中的Goroutine如何理解

發布時間:2022-01-17 16:32:11 來源:億速云 閱讀:163 作者:kk 欄目:大數據

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

什么是Go協程

Go協程(Goroutine)是與其他函數同時運行的函數。可以認為Go協程是輕量級的線程,由Go運行時來管理。

在函數調用前加上go關鍵字,這次調用就會在一個新的goroutine中并發執行。當被調用的函數返回時,這個goroutine也自動結束。聽著感覺像C# 中的Task。

需要注意的是,如果這個函數有返回值,那么這個返回值會被丟棄。

Golang中的Goroutine如何理解

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(管道)

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的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西乡县| 德格县| 县级市| 微博| 武威市| 政和县| 娱乐| 宜城市| 乌兰察布市| 堆龙德庆县| 乐平市| 若尔盖县| 忻州市| 伊川县| 华蓥市| 乌苏市| 南康市| 建德市| 永康市| 桓台县| 新乡县| 枣阳市| 旌德县| 宝应县| 卢湾区| 黔东| 琼海市| 福州市| 曲阳县| 出国| 丽江市| 临泉县| 棋牌| 余干县| 灵丘县| 越西县| 连城县| 黄大仙区| 博白县| 金平| 琼海市|