文章目录

  • GoLang之图解channel之读、写、关闭

GoLang之图解channel之读、写、关闭


为什么这样写就不会阻塞了呢?因为下面的代码会被编译器转换为对runtime.selectnbsend的调用。

select {case ch <- 12:... foo
default:... bar
}

runtime.selectnbsend也仅仅是调用了runtime.chansend,但是会标记上非阻塞。

//编译后
if selectnbsend(ch, 12) {... foo
} else {... bar
}
func selectnbsend(c *hchan, elem unsafe.Pointer) (selected bool) {return chansend(c, elem, false, getcallerpc())
}func chansend(c *hchan, ep unsafe.Pointer, block bool, callerpc uintptr) bool

所以,如果缓冲区指望不上,又没有谁在等着recv,又或者channel为nil…
总而言之,send任务不能马上执行,需要等待。那么selectnbsend函数就会返回false,对应的协程也就不会进到sendq里等待了。

非阻塞式的读操作,会被编译器转换为对runtime.selectnbrecv或selectnbrecv2的调用,而它们也仅仅是调用了runtime.chanrecv,只不过在需要等待时会返回false。

select {case v = <-c:... foo
default:... bar
}// 被编译器转化为
if selectnbrecv(&v, c) {... foo
} else {... bar
}
//comma ok写法
select {case v, ok = <-c:... foo
default:... bar
}// 被编译器转化为
if c != nil && selectnbrecv2(&v, &ok, c) {... foo
} else {... bar
}

若channel关闭,
hchan.closed=1;
等待recv的协程接收到零值;
协程离开channel的recvq回到run queue中。


channel关闭后,
缓冲区里的数据还可以读,直到读完。
但是不能再写,否则会panic。

这些等待send的G都会离开sendq,
恢复到_Grunnable状态,
回到协程run queue中,
协程恢复执行时会发生panic。

缓冲区里的数据还可以读,直到读完。
sendq里等待的协程,
处理逻辑同无缓冲的场景一样~

channel对应的数据结构,以及读、写、关闭的基本逻辑,就简单介绍到这里~

GoLang之图解channel之读、写、关闭相关推荐

  1. 《图解HTTP》读感

    <图解HTTP>读感 前言 一.HTTP各版本 二.URL.URI 三.HTTP存在的问题 四.对称加密和非对称加密 五.数字证书 六.SSL握手过程 前言 如果有一定的计算机网络基础,这 ...

  2. 文本文件 java_简单的用java实现读/写文本文件的示例

    简单的用java实现读/写文本文件的示例 更新时间:2008年07月26日 13:09:26   作者: 同时也展示了如果从输入流中读出来内容写入输出流中(仅限文本流) 三个例子可以独立存在,所以根据 ...

  3. 文本文件写java_Java 读/写文件文本文件的示例

    /* * 简单的读/写文本文件的示例 * 这里包含了三个例子,即 * 1. 将文件读入到内存(这里是StringBuffer)的例子 * 2. 将内容中的文本写到文件 * 3. 将一个文件的内容读出来 ...

  4. 什么是.Net的异步机制(异步Stream读/写) - step 4

    在前面3篇文章,我已经介绍了异步的工作原理和相关方法和参数的应用.下面我们介绍Stream流的操作, 并使用System.IO.FileStream来揭开如何开发异步的Stream(System.IO ...

  5. java fileinputreader_java BufferedReader,FileInputStream实现文本文件读/写

    /* * 简单的读/写文本文件的示例 * 这里包含了三个例子,即 * 1. 将文件读入到内存(这里是StringBuffer)的例子 * 2. 将内容中的文本写到文件 * 3. 将一个文件的内容读出来 ...

  6. 实验九 使用异步方式实现文件读\写

    实验九 使用异步方式实现文件读\写 一.实验目的 了解Windows系统异步文件读/写的概念. 熟悉Windows系统文件读/写相关的API. 掌握采用异步方式实现文件读/写的相关参数设置. 二.实验 ...

  7. mpi4py 并行读/写 numpy npy 文件的方法

    本文从本人简书博客同步过来 在上一篇中我们介绍了 mpi4py 中获得高性能 I/O 的方法和建议,下面我们将介绍 mpi4py 并行读/写 numpy npy 文件的方法. 在使用 mpi4py 写 ...

  8. SPI Flash 读/写/擦除函数(适用于1MB Flash)

    SPI Flash 读/写/擦除函数(适用于1MB Flash) 一.GD25Q80B 介绍 二.相关宏定义 三.读取FLASH设备的厂商和设备标识 四.擦除FLASH设备扇区/块 五.FLASH 设 ...

  9. android 字节流读取,使用字节流读/写文件

    Java 的 I/O 流提供了一条通道,这条通道可以把数据送给目的地.输入流的指向称作源,程序从指向源的输入流中读取源中的数据.输出流的指向是数据要去的目的地,程序通过向输出流中写入数据把信息传递到目 ...

最新文章

  1. 报表应用系列——图表JFreeChart: 第 4 章 折线图
  2. 史蒂夫·乔布斯很懂团队建设
  3. 跟燕十八学习PHP-第十九天-热身项目完善
  4. ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力 )
  5. Servlet 过滤器笔记
  6. 最新手机芯片AI跑分出炉:高通、联发科力压华为
  7. 45岁以后的IT人生
  8. java inputstream编码格式_纯文本-FileInputStream的编码与解码方式
  9. acegis连接使用方法_arcgis工具使用方法
  10. java学生成绩管理设计报告_Java 学生成绩管理系统(含论文,开题报告)源码
  11. Redis 菜鸟教程学习笔记- Redis 配置
  12. 浅析HashMap底层原理
  13. DDD领域驱动(四)——之领域建模
  14. element-ui表格编辑
  15. 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[2]
  16. 写好英语科技论文的诀窍: 主动迎合读者期望,预先回答专家可能质疑--周耀旗教授...
  17. 广汽埃安发布新LOGO,推出全新高端品牌Hyper昊铂
  18. vm linux安装增强功能,VirtualBox虚拟机CentOS安装增强功能Guest Additions(示例代码)
  19. Vue引入并使用Element-UI组件库的两种方式
  20. 参加IBM素质拓展活动

热门文章

  1. Spring | 深入理解面向切面编程(AOP)
  2. 统计学 回归分析( Regression Analysis)
  3. 【08】jQuery:01-jQuery介绍、jQuery基本使用、jQuery选择器、jQuery样式操作、jQuery效果、jQuery入口函数、jQuery对象
  4. 一些关于保研夏令营的心得体会!
  5. 一些恶搞人的C++程序(千万别试,会哭的)
  6. C和C++的区别(2) 关键字
  7. 打车APP为何贴钱做生意?
  8. CCBN 官方APP STORE隐私政策
  9. scrapy爬取——阿里招聘信息
  10. 给2500万行代码修复bug的程序员都怎么上班?