您好,登錄后才能下訂單哦!
這篇“Go語言通道之緩沖通道實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go語言通道之緩沖通道實例分析”文章吧。
有緩沖的通道相比于無緩沖通道,多了一個緩存的功能,如下圖描述的一樣:
從圖上可以明顯看到和無緩沖通道的區(qū)別,無緩沖必須兩個Goroutine都進入通道才能進行數(shù)據(jù)的交換,這個不用,如果數(shù)據(jù)有,直接就能拿走。
package ChannelDemo import ( "fmt" "math/rand" "sync" "time" ) const ( numberGoroutines = 4 taskLoad = 10 ) var bufferWg sync.WaitGroup func init() { rand.Seed(time.Now().Unix()) } func main() { //創(chuàng)建了一個10任務(wù)的緩沖通道 tasks := make(chan string, taskLoad) bufferWg.Add(numberGoroutines) //創(chuàng)建4個Goroutine for gr := 1; gr <= numberGoroutines; gr++ { go worker(tasks, gr) } //向緩沖通道中放入數(shù)據(jù) for post := 1; post <= taskLoad; post++ { tasks <- fmt.Sprintf("Task : %d", post) } close(tasks) bufferWg.Wait() } func worker(tasks chan string, worker int) { defer bufferWg.Done() for { task, ok := <-tasks if !ok { fmt.Printf("Worker: %d : 結(jié)束工作 \n", worker) return } fmt.Printf("Worker: %d : 開始工作 %s\n", worker, task) //隨機處理一下工作的時間 sleep := rand.Int63n(100) time.Sleep(time.Duration(sleep) * time.Millisecond) fmt.Printf("Worker: %d : 完成工作 %s\n", worker, task) } }
運行結(jié)果:
Worker: 3 : 開始工作 Task : 4
Worker: 2 : 開始工作 Task : 2
Worker: 1 : 開始工作 Task : 1
Worker: 4 : 開始工作 Task : 3
Worker: 4 : 完成工作 Task : 3
Worker: 4 : 開始工作 Task : 5
Worker: 2 : 完成工作 Task : 2
Worker: 2 : 開始工作 Task : 6
Worker: 3 : 完成工作 Task : 4
Worker: 3 : 開始工作 Task : 7
Worker: 1 : 完成工作 Task : 1
Worker: 1 : 開始工作 Task : 8
Worker: 3 : 完成工作 Task : 7
Worker: 3 : 開始工作 Task : 9
Worker: 1 : 完成工作 Task : 8
Worker: 1 : 開始工作 Task : 10
Worker: 4 : 完成工作 Task : 5
Worker: 4 : 結(jié)束工作
Worker: 3 : 完成工作 Task : 9
Worker: 3 : 結(jié)束工作
Worker: 2 : 完成工作 Task : 6
Worker: 2 : 結(jié)束工作
Worker: 1 : 完成工作 Task : 10
Worker: 1 : 結(jié)束工作
因為哪一個worker先從通道中取值有系統(tǒng)自己進行調(diào)度的,所以每次運行的結(jié)果稍微不同,但是相同的是10個任務(wù)被4個協(xié)程有條不紊的完成了
注意:main中有一句代碼 Close(tasks) 關(guān)閉通道的代碼非常重要。當(dāng)通道關(guān)閉后,goroutine 依舊可以從通道接收數(shù)據(jù),但是不能再向通道里發(fā)送數(shù)據(jù)。
能夠從已經(jīng)關(guān)閉的通道接收數(shù)據(jù)這一點非常重要,因為這允許通道關(guān)閉后依舊能取出其中緩沖的全部值,而不會有數(shù)據(jù)丟失.
以上就是關(guān)于“Go語言通道之緩沖通道實例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。