91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Go語言通道之緩沖通道實例分析

發布時間:2022-07-16 13:48:17 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

這篇“Go語言通道之緩沖通道實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go語言通道之緩沖通道實例分析”文章吧。

有緩沖的通道相比于無緩沖通道,多了一個緩存的功能,如下圖描述的一樣:

Go語言通道之緩沖通道實例分析

從圖上可以明顯看到和無緩沖通道的區別,無緩沖必須兩個Goroutine都進入通道才能進行數據的交換,這個不用,如果數據有,直接就能拿走。

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() {
    //創建了一個10任務的緩沖通道
    tasks := make(chan string, taskLoad)
    bufferWg.Add(numberGoroutines)

    //創建4個Goroutine
    for gr := 1; gr <= numberGoroutines; gr++ {
        go worker(tasks, gr)
    }

    //向緩沖通道中放入數據
    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 : 結束工作 \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)
    }
}

運行結果:

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 : 結束工作
Worker: 3 : 完成工作 Task : 9
Worker: 3 : 結束工作
Worker: 2 : 完成工作 Task : 6
Worker: 2 : 結束工作
Worker: 1 : 完成工作 Task : 10
Worker: 1 : 結束工作 

因為哪一個worker先從通道中取值有系統自己進行調度的,所以每次運行的結果稍微不同,但是相同的是10個任務被4個協程有條不紊的完成了

注意:main中有一句代碼 Close(tasks) 關閉通道的代碼非常重要。當通道關閉后,goroutine 依舊可以從通道接收數據,但是不能再向通道里發送數據。

能夠從已經關閉的通道接收數據這一點非常重要,因為這允許通道關閉后依舊能取出其中緩沖的全部值,而不會有數據丟失.

以上就是關于“Go語言通道之緩沖通道實例分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

合江县| 马鞍山市| 陇西县| 搜索| 东源县| 焦作市| 黄骅市| 安多县| 吉水县| 普格县| 阿克| 吉林省| 武城县| 巍山| 龙胜| 尚志市| 和顺县| 莱芜市| 治县。| 安龙县| 牟定县| 兴山县| 句容市| 穆棱市| 大兴区| 花莲市| 富顺县| 象山县| 库尔勒市| 定西市| 武穴市| 新巴尔虎右旗| 天柱县| 安溪县| 无极县| 长垣县| 石楼县| 红安县| 修文县| 巴林左旗| 崇阳县|