最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言通道之緩沖通道

 更新時(shí)間:2022年07月16日 09:22:52   作者:奮斗的大橙子  
這篇文章介紹了Go語言通道之緩沖通道,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前文為大家講解了Go語言通道之無緩沖通道

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

從圖上可以明顯看到和無緩沖通道的區(qū)別,無緩沖必須兩個(gè)Goroutine都進(jìn)入通道才能進(jìn)行數(shù)據(jù)的交換,這個(gè)不用,如果數(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)建了一個(gè)10任務(wù)的緩沖通道
    tasks := make(chan string, taskLoad)
    bufferWg.Add(numberGoroutines)

    //創(chuàng)建4個(gè)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)

        //隨機(jī)處理一下工作的時(shí)間
        sleep := rand.Int63n(100)
        time.Sleep(time.Duration(sleep) * time.Millisecond)

        fmt.Printf("Worker: %d : 完成工作 %s\n", worker, task)
    }
}

運(yùn)行結(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é)束工作 

因?yàn)槟囊粋€(gè)worker先從通道中取值有系統(tǒng)自己進(jìn)行調(diào)度的,所以每次運(yùn)行的結(jié)果稍微不同,但是相同的是10個(gè)任務(wù)被4個(gè)協(xié)程有條不紊的完成了

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

能夠從已經(jīng)關(guān)閉的通道接收數(shù)據(jù)這一點(diǎn)非常重要,因?yàn)檫@允許通道關(guān)閉后依舊能取出其中緩沖的全部值,而不會(huì)有數(shù)據(jù)丟失.

總結(jié)

無緩沖的通道保證同時(shí)交換數(shù)據(jù),而有緩沖的通道不做這種保證。

到此這篇關(guān)于Go語言通道之緩沖通道的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Go語言實(shí)現(xiàn)基于websocket瀏覽器通知功能

    Go語言實(shí)現(xiàn)基于websocket瀏覽器通知功能

    這篇文章主要介紹了Go語言實(shí)現(xiàn)基于websocket瀏覽器通知功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Golang 在gin框架中如何使用JWT鑒權(quán)

    Golang 在gin框架中如何使用JWT鑒權(quán)

    JWT,全稱 JSON Web Token,是一種開放標(biāo)準(zhǔn)(RFC 7519),用于安全地在雙方之間傳遞信息,這篇文章主要介紹了golang 在Gin框架中使用JWT鑒權(quán),需要的朋友可以參考下
    2024-07-07
  • Go批量操作excel導(dǎo)入到mongodb的技巧

    Go批量操作excel導(dǎo)入到mongodb的技巧

    這篇文章主要介紹了Go批量操作excel導(dǎo)入到mongo,包括選擇命令行包,讀取配置連接數(shù)據(jù)庫的方法,本文示例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • golang實(shí)現(xiàn)命令行程序的使用幫助功能

    golang實(shí)現(xiàn)命令行程序的使用幫助功能

    這篇文章介紹了golang實(shí)現(xiàn)命令行程序使用幫助的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang sync.Pool的源碼解析

    Golang sync.Pool的源碼解析

    Pool是用于存放臨時(shí)對(duì)象的集合,這些對(duì)象是為了后續(xù)的使用,以達(dá)到復(fù)用對(duì)象的效果,本文將詳解解析sync.Pool 源碼,需要的朋友可以參考下
    2023-05-05
  • Go語言關(guān)于幾種深度拷貝(deepcopy)方法的性能對(duì)比

    Go語言關(guān)于幾種深度拷貝(deepcopy)方法的性能對(duì)比

    這篇文章主要介紹了Go語言關(guān)于幾種深度拷貝(deepcopy)方法的性能對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • go語言-在mac下brew升級(jí)golang

    go語言-在mac下brew升級(jí)golang

    這篇文章主要介紹了go語言-在mac下brew升級(jí)golang,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 一文帶你掌握Go語言中文件的寫入操作

    一文帶你掌握Go語言中文件的寫入操作

    這篇文章主要和大家分享一下Go語言中文件的寫入操作,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    Golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換超全面詳細(xì)講解

    說實(shí)話,golang的時(shí)間轉(zhuǎn)化還是很麻煩的,最起碼比php麻煩很多,下面這篇文章主要給大家介紹了關(guān)于golang時(shí)間/時(shí)間戳的獲取與轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • go:gin輸出日志文件方式

    go:gin輸出日志文件方式

    這篇文章主要介紹了go:gin輸出日志文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

罗江县| 达尔| 色达县| 普格县| 鄄城县| 麻江县| 花莲县| 长顺县| 龙海市| 安塞县| 义乌市| 绵阳市| 扶风县| 安泽县| 江西省| 长垣县| 乐清市| 金川县| 卢龙县| 铁岭市| 正蓝旗| 德清县| 仙居县| 靖安县| 云龙县| 家居| 新源县| 依安县| 定南县| 漳州市| 苍南县| 调兵山市| 同心县| 平远县| 托克托县| 科尔| 宁乡县| 莱阳市| 会宁县| 吉首市| 南陵县|