GoLang之图解channel之读、写、关闭
文章目录
- 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之读、写、关闭相关推荐
- 《图解HTTP》读感
<图解HTTP>读感 前言 一.HTTP各版本 二.URL.URI 三.HTTP存在的问题 四.对称加密和非对称加密 五.数字证书 六.SSL握手过程 前言 如果有一定的计算机网络基础,这 ...
- 文本文件 java_简单的用java实现读/写文本文件的示例
简单的用java实现读/写文本文件的示例 更新时间:2008年07月26日 13:09:26 作者: 同时也展示了如果从输入流中读出来内容写入输出流中(仅限文本流) 三个例子可以独立存在,所以根据 ...
- 文本文件写java_Java 读/写文件文本文件的示例
/* * 简单的读/写文本文件的示例 * 这里包含了三个例子,即 * 1. 将文件读入到内存(这里是StringBuffer)的例子 * 2. 将内容中的文本写到文件 * 3. 将一个文件的内容读出来 ...
- 什么是.Net的异步机制(异步Stream读/写) - step 4
在前面3篇文章,我已经介绍了异步的工作原理和相关方法和参数的应用.下面我们介绍Stream流的操作, 并使用System.IO.FileStream来揭开如何开发异步的Stream(System.IO ...
- java fileinputreader_java BufferedReader,FileInputStream实现文本文件读/写
/* * 简单的读/写文本文件的示例 * 这里包含了三个例子,即 * 1. 将文件读入到内存(这里是StringBuffer)的例子 * 2. 将内容中的文本写到文件 * 3. 将一个文件的内容读出来 ...
- 实验九 使用异步方式实现文件读\写
实验九 使用异步方式实现文件读\写 一.实验目的 了解Windows系统异步文件读/写的概念. 熟悉Windows系统文件读/写相关的API. 掌握采用异步方式实现文件读/写的相关参数设置. 二.实验 ...
- mpi4py 并行读/写 numpy npy 文件的方法
本文从本人简书博客同步过来 在上一篇中我们介绍了 mpi4py 中获得高性能 I/O 的方法和建议,下面我们将介绍 mpi4py 并行读/写 numpy npy 文件的方法. 在使用 mpi4py 写 ...
- SPI Flash 读/写/擦除函数(适用于1MB Flash)
SPI Flash 读/写/擦除函数(适用于1MB Flash) 一.GD25Q80B 介绍 二.相关宏定义 三.读取FLASH设备的厂商和设备标识 四.擦除FLASH设备扇区/块 五.FLASH 设 ...
- android 字节流读取,使用字节流读/写文件
Java 的 I/O 流提供了一条通道,这条通道可以把数据送给目的地.输入流的指向称作源,程序从指向源的输入流中读取源中的数据.输出流的指向是数据要去的目的地,程序通过向输出流中写入数据把信息传递到目 ...
最新文章
- 报表应用系列——图表JFreeChart: 第 4 章 折线图
- 史蒂夫·乔布斯很懂团队建设
- 跟燕十八学习PHP-第十九天-热身项目完善
- ubuntu 只有客人会话登录(第一次深刻感受文件权限的威力 )
- Servlet 过滤器笔记
- 最新手机芯片AI跑分出炉:高通、联发科力压华为
- 45岁以后的IT人生
- java inputstream编码格式_纯文本-FileInputStream的编码与解码方式
- acegis连接使用方法_arcgis工具使用方法
- java学生成绩管理设计报告_Java 学生成绩管理系统(含论文,开题报告)源码
- Redis 菜鸟教程学习笔记- Redis 配置
- 浅析HashMap底层原理
- DDD领域驱动(四)——之领域建模
- element-ui表格编辑
- 【Tensorflow2.0】8、tensorflow2.0_hdf5_savedmodel_pb模型转换[2]
- 写好英语科技论文的诀窍: 主动迎合读者期望,预先回答专家可能质疑--周耀旗教授...
- 广汽埃安发布新LOGO,推出全新高端品牌Hyper昊铂
- vm linux安装增强功能,VirtualBox虚拟机CentOS安装增强功能Guest Additions(示例代码)
- Vue引入并使用Element-UI组件库的两种方式
- 参加IBM素质拓展活动
热门文章
- Spring | 深入理解面向切面编程(AOP)
- 统计学 回归分析( Regression Analysis)
- 【08】jQuery:01-jQuery介绍、jQuery基本使用、jQuery选择器、jQuery样式操作、jQuery效果、jQuery入口函数、jQuery对象
- 一些关于保研夏令营的心得体会!
- 一些恶搞人的C++程序(千万别试,会哭的)
- C和C++的区别(2) 关键字
- 打车APP为何贴钱做生意?
- CCBN 官方APP STORE隐私政策
- scrapy爬取——阿里招聘信息
- 给2500万行代码修复bug的程序员都怎么上班?