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语言通道之缓冲通道的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持易知道(ezd.cc)。
相关内容
-
电脑硬盘csgo凭空消失|csgo突然消失
电脑硬盘csgo凭空消失|csgo突然消失,,1. csgo突然消失可能是系...
-
goole截图快捷键|googlechrome截图快捷键
goole截图快捷键|googlechrome截图快捷键,,1. googlechrome截...
-
Google发布Android 13 Beta 3.1 修复忘加测试反
Google发布Android 13 Beta 3.1 修复忘加测试反馈应用的单一...
-
csgo参数设置|csgo怎么保存
csgo参数设置|csgo怎么保存,,csgo怎么保存第一步下载csgo的官...
-
aigo无线硬盘连电脑|aigo优盘连接手机
aigo无线硬盘连电脑|aigo优盘连接手机,,1. aigo优盘连接手机不...
-
电脑开机看见logo就|电脑开机看见logo就死机
电脑开机看见logo就|电脑开机看见logo就死机,,电脑开机看见log...
-
csgo高手快捷键|csgo快捷键指令
csgo高手快捷键|csgo快捷键指令,,1. csgo快捷键指令反恐精英全...
-
SOUGOU输入法快捷键|搜狗输入法快捷键设置在哪
SOUGOU输入法快捷键|搜狗输入法快捷键设置在哪里,,搜狗输入法...
-
gopro如何导入电脑软件|gopro怎么导入电脑
gopro如何导入电脑软件|gopro怎么导入电脑,,1. gopro怎么导入...
-
电脑串口缓冲区|电脑串口缓冲区大小
电脑串口缓冲区|电脑串口缓冲区大小,,1. 电脑串口缓冲区大小封...
-
csgo电脑只能5v5|csgo电脑只能开到60帧
csgo电脑只能5v5|csgo电脑只能开到60帧,,1. csgo电脑只能开到6...
-
aigo电脑主机系统重启|csgo重启电脑
aigo电脑主机系统重启|csgo重启电脑,,csgo重启电脑如果重启成...
-
csgo电脑等级|csgo电脑等级指令
csgo电脑等级|csgo电脑等级指令,,csgo电脑等级指令如图:竞技匹...
-
csgo设置准星|csgo设置准星大小
csgo设置准星|csgo设置准星大小,,csgo设置准星大小csgo怎么设...
-
6500元技嘉酷睿i5四核+gv-n56goc主流游戏配置单
6500元技嘉酷睿i5四核+gv-n56goc主流游戏配置单,,头条新闻在七...