Go并发编程之三

一、前言

前一篇讲了Go中通道的概念,只讲了无缓存通道,这一篇我们来了解一下有缓存通道以及它与无缓存通道一些区别。

二、有缓存通道

  • **无缓存通道:**如果通道数据没有被接收,发送方会被阻塞,相当于同步。

  • 有缓存通道:发送数据到通道会被放在队列中,接收时从队列删除数据,当通道满的时候发送方才会阻塞,如果通道是空的则接收方也会被阻塞,很像FIFO先进先出的队列,发送方和接收方可以认为是异步解耦的。

创建有缓存通道

ch := make(chan string ,10)

ch := make(chan string ,1) 当设置为1创建的也是有缓存通道,而非无缓存通道。

ch := make(chan string ,0) 相当于 ch := make(chan string) 创建的是无缓存通道

三、例子

注:获取goroutine的编号,现在官方不提供让你直接获取goroutine ID,也不建议你使用,但还是可以通过stack中获取到。

我们通过下面例子来看有缓存和无缓存通道的实际区别

执行结果:

注:创建容量为2的缓存通道,子goroutine向通道写入5条数据,主goroutine从通道读出两条数据,查看执行结果往通道写数据执行了4次,另外1次没有执行,说明往通道写的时候阻塞了。往通道写4条数据,其中有两条数据被主goroutine读取了,然后通道中还剩余2条数据,这和通道容量大小一致。

如果将通道设置为无缓存通道 size :=0

执行结果:

注:子goroutine只往通道写了两条数据,因为主goroutine读取了2条,另外3条写入时就全部都阻塞了。

特别说明

子goroutine写入阻塞,主goroutine不一定阻塞,为了演示效果代码最后加了一个死循环for{},如果没有加for{},当有缓存通道还有容量空间却不一定能往里放,因为有可能主goroutine已经执行完了,然后整个进程就Over了,子协程生命依赖于主协程这个概念Go并发编程第一篇就有介绍,但今天在写这个代码时没有意识到,折腾了好一会才发现问题,然后在朋友建议了加了空for{}。

相关推荐
汉字萌萌哒44 分钟前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter1 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
极创信息1 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒2 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院2 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
喜欢的名字被抢了2 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
小雨笙笙2 小时前
C语言:变量三属性——存储类型
c语言·开发语言
数据知道3 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
果果燕3 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++
江畔柳前堤3 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php