首页 > 编程语言 >go channel源码

go channel源码

时间:2022-12-26 17:35:27浏览次数:37  
标签:return chan 环形 源码 数组 go 数据 channel

大纲

  1. 是什么,结构体定义
  2. 给chan送数据
  3. 从chan读数据

 


是什么?

1 本质是一个环形数组 源码中定义为hchan 主要属性有
  1. 数组长度
  2. 数据数量
  3. 环形数组
  4. 环形数组的头尾索引
  5. 等待读chan的go链表
  6. 等待写chan的go链表
 

给chan送数据

就是外部goroutine向chan发送数据,
  1. 如果chan关闭了就panic
  2. 如果有go正在等待从chan读数据,就直接把数据给它,就不经过环形数组了,然后return
  3. 如果不是,再看如果环形数组中还有空位,就写入环形数组,移动头尾指针,数据数量计数+1,然后return
  4. 如果还不是,就把当前业务的go存入等待队列,然后阻塞,就暂定在这里,如果有外部go读数据了就唤醒阻塞,业务go继续执行
 

从chan接收数据

就是外部goroutine从chan接收数据  
  1. 如果chan已经关闭了,就直接返回
  2. 如果有go正在等待向chan写数据,那么就直接等待go的数据给这个go,然后return。不经过环形数组
  3. 如果环形数组有数据,就从环形数组取出数据,移动指针,然后return
  4. 如果都没有,就阻塞,就暂定,就等待外部go写入数据、写了再唤醒,再继续执行

标签:return,chan,环形,源码,数组,go,数据,channel
From: https://www.cnblogs.com/dong-qi/p/17006260.html

相关文章

  • Java同步器之ReentrantLock源码分析(一)
    一、概述ReentrantLock是Java并发包中提供的一个可重入的互斥锁。ReentrantLock和synchronized在基本用法,行为语义上都是类似的,同样都具有可重入性。只不过相比原生的Syn......
  • beego
    什么是beegobeego时基于mvc架构实现的web框架beego的优势语言层面支持并发内置强大的插件部署简单智能化,可以监控cpu,memory,goroutin强大的网络库 ......
  • (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序
    一、综述   如何采集图片?在windows环境下,我们可以使用dshow,在linux下,也有ffmpeg等基础类库,再不济,opencv自带的videocapture也是提供了基础的支撑。那么在andoird......
  • Java同步器之AQS源码分析
    一、简介AbstractQueuedSynchronizer(简称AQS),抽象的队列式的同步器,是Java并发包实现的基类。AQS用来构建锁和同步器的框架,使用AQS能简单且高效地构造出大量的应用广泛......
  • Apache Ranger系列九:修改源码支持URI类型为s3的操作
    问题描述:ranger在checkPrivileges(org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizer)时,当类型是uri时会校验格式,必须是hdfs:,file:if(hiveObjTyp......
  • 基于DJango和Pybind11,实现网络后端调用OpenCV算法
    本Blog来源于实际项目,所采用框架组合中,OpenCV实现算法主体、pybind11完成OpenCV的Python封装、django提供Web应用服务,三者协同配合,共同实现“网络后端调用OpenCV算法,解决特......
  • break、continue、go to
    break、continue、gotobreak在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)......
  • go值接收者和指针接收者的区别
    方法的接收者packagemainimport( "fmt")typePersonstruct{ Namestring Ageint}func(pPerson)walking(){ fmt.Println("我是值类型方法") fmt.Prin......
  • Django:auth认证模块
    目录一、django的auth认证模块1.什么是auth模块2.生成auth物理表二、创建django-admin账户1.创建超级管理员2.注册超级管理员账户3.登录admin账户三、auth模块中的方法1.导......
  • django中间件
    django中间件django默认有七个中间件并且还支持用户自定义中间件中间件主要可以用于:网站访问频率的校验用户权限的校验等全局类型的功能需求MIDDLEWARE=['......