当前位置: 首页 > news >正文

golang channel

channel是不同协程之间异步通信的数据结构。

基本用法

1 构造

ch:=make(chan int)//无缓冲
ch:=make(chan int,10)//有缓冲

2 读操作

val:=<-ch
<-ch
val,ok:=<-ch

3 写

var data int
ch<-data

4 关闭

close(ch)

5 多路复用

select{
case <-parent.Done():child.cancel(false,parent.Err())
case <-child.Done():
}

实现对多个channel同时监听

select{
case <-ch1://// do some logic
case ch3 <-data://// do some logic
default:// 放行
}

核心数据结构

三个核心:
1 并发读写安全,需要锁
2 环形缓冲区(数组+头尾指针),好处是复用数组空间,同时保证内存地址连续
3 承载阻塞goroutine的队列

type hchan struct{ // runtime包下qcount unit  // total data in the queuedataqsize uint // size of the circular queuebuf unsafe.Pointer  // points to an array of dataqsiz elementselemsize uint 16closed uint 32elemtype *_type  //element typesendx uint  //send indexrecvx uint  //receive indexsendq waitq  // list of send waitersrecvq waitq  //list of recv waiterslock mutex
}

hchan:channel数据结构

  • qcount:当前channel中存在多少个元素
  • dataqsize:当前channel中能存放的元素容量
  • buf:channel中用于存放元素的环形缓冲区
  • elemsize:channel中存放元素类型的大小
  • closed:标识channel是否关闭
  • elemtype:channel元素类型
  • sendx:发送元素进入环形缓冲区的index
  • recvx:接收元素所处的环形缓冲区的index
  • sendq:因发送而陷入阻塞的协程队列
  • recvq:因接收而陷入阻塞的协程队列
type waitq struct{ // 阻塞的协程队列first *sudog  // 队列头部last *sudog  //队列尾部
}
type sudog struct{ // 阻塞的协程队列g *gprev *sudog  // 队列头部next *sudog  //队列尾部elem unsafe.Pointer  // data element(may point to stack)isSelect boolc *hchan
}
  • sudog:用于包装协程的节点
  • g:goroutine,协程
  • prev:队列中的上一个节点
  • next:队列中的下一个节点
  • isSelect:标识当前协程是否处在select多路复用的流程中
  • c:标识与当前sudog交互的chan
http://www.lryc.cn/news/146824.html

相关文章:

  • 高等职业学校物联网实训室建设方案
  • Python基础学习第四天:Python注释
  • Puppeteer中使用Stealth.min.js库
  • JVM ZGC垃圾收集器
  • 事务管理-事务进阶-propagation属性
  • 树多选搜索查询,搜索后选中状态仍保留
  • 数据结构--字典树(trie)
  • iframe通过postMessage进行跨域通信以及在Angular中使用
  • rust学习-引用C库
  • WebAssembly 在云原生中的实践指南
  • Azure sqlserver 更改字符集
  • git push时,由于commit了大文件无法成功push的解决办法
  • 2023_Spark_实验一:Windows中基础环境安装
  • 如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻
  • 深度学习(十)--- cv2.pointPolygonTest() 判断一点是否在指定区域内
  • 后端面试话术集锦第 八 篇:redis面试话术
  • LiteOS qemu realview-pbx-a9 环境搭建与运行
  • Kubernetes技术--Kubernetes架构组件以及核心概念
  • 拿来即用修改密码功能
  • 违背原则才能写好代码(一)
  • 面试官眼中的理想候选人:如何成为他们的首选
  • ES6中的扩展运算符你真的会用吗?
  • 利用逻辑回归判断病人肺部是否发生病变
  • 全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”
  • 设计模式行为型-状态模式
  • 弹窗、抽屉、页面跳转区别 | web交互入门
  • 说说Flink运行模式
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码
  • C语言控制语句——分支语句