golang channel几点总结
golang提倡使用通讯来共享数据,而不是通过共享数据来通讯。channel就是golang这种方式的体现。
Channel
在golang中有两种channel:带缓存的和不带缓存。
- 带缓存的channel,也就是可以异步收发的。
- 不带缓存的channel,也就是同步收发的。
发送:
• 向 nil channel 发送数据,阻塞。
• 向 closed channel 发送数据,出错。
• 同步发送: 如有接收者,交换数据。否则排队、阻塞。
• 异步发送: 如有空槽,拷⻉贝数据到缓冲区。否则排队、阻塞。
接收:
• 从 nil channel 接收数据,阻塞。
• 从 closed channel 接收数据,返回已有数据或零值。
• 同步接收: 如有发送者,交换数据。否则排队、阻塞。
• 异步接收: 如有缓冲项,拷⻉贝数据。否则排队、阻塞。
底层实现
使用channel时,多个goroutine并发发送和接收,却无需加锁,为什么呢?
其实,是由底channel层实现做支撑的。
channel的具体定义参见/usr/local/go/src/runtime/chan.go
type hchan struct {
qcount uint // total data in the queue
dataqsiz uint // size of the circular queue
buf unsafe.Pointer // points to an array of dataqsiz elements
elemsize uint16
closed uint32
elemtype *_type // element type
sendx uint // send index
recvx uint // receive index
recvq waitq // list of recv waiters
sendq waitq // list of send waiters
// lock protects all fields in hchan, as well as several
// fields in sudogs blocked on this channel.
//
// Do not change another G's status while holding this lock
// (in particular, do not ready a G), as this can deadlock
// with stack shrinking.
lock mutex
}
可以看到,有lock字段,在使用channel进行发送和接收的时候,会进行加锁保护。
参考
雨痕《Go学习笔记 第四版》
golang channel几点总结的更多相关文章
- golang channel的使用以及调度原理
golang channel的使用以及调度原理 为了并发的goroutines之间的通讯,golang使用了管道channel. 可以通过一个goroutines向channel发送数据,然后从另一个 ...
- golang channel关闭后,是否可以读取剩余的数据
golang channel关闭后,其中剩余的数据,是可以继续读取的. 请看下面的测试例子. 创建一个带有缓冲的channel,向channel中发送数据,然后关闭channel,最后,从channe ...
- golang channel原理
channel介绍 channel一个类型管道,通过它可以在goroutine之间发送和接收消息.它是Golang在语言层面提供的goroutine间的通信方式. 众所周知,Go依赖于称为CSP(Co ...
- golang channel 用法转的
一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Gra ...
- golang channel初次接触
goroutine之间的同步 goroutine是golang中在语言级别实现的轻量级线程,仅仅利用go就能立刻起一个新线程.多线程会引入线程之间的同步问题,经典的同步问题如生产者-消费者问题,在c, ...
- 如何优雅的关闭Golang Channel?
Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费 ...
- golang channel 源码剖析
channel 在 golang 中是一个非常重要的特性,它为我们提供了一个并发模型.对比锁,通过 chan 在多个 goroutine 之间完成数据交互,可以让代码更简洁.更容易实现.更不容易出错. ...
- golang channel本质——共享内存
channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键.channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递 ...
- Golang channel 用法简介
channel 是 golang 里相当有趣的一个功能,大部分时候 channel 都是和 goroutine 一起配合使用.本文主要介绍 channel 的一些有趣的用法. 通道(channel), ...
随机推荐
- java学习笔记18(基本类型包装类,system类)
基本类型包装类 定义:程序界面用户输入的数据都是以字符串类型存储的,如果需要操作这些字符串进行运算,需要转成基本数据类型,这时就要用到基本类型包装类,例: public class Demo { pu ...
- SpringdataJpa的官方API学习
(将对Springdata JPA的API 第三章之后进行解释) 一 . Core concepts(核心概念) 1.springdata中的中心接口是——Repository.这个接口没有什么重 ...
- oracle函数创建及调用
创建函数的语法如下: CREATE [OR REPLACE] FUNCTION function_name[ (argment [ { IN | OUT | IN OUT } ] Type , arg ...
- 在PHP5.4上使用Google翻译的API报错
/********************************************************************** * 在PHP5.4上使用Google翻译的API报错 * ...
- Ubuntu Core 网络配置
/********************************************************************************* * Ubuntu Core 网络配 ...
- EtherNet/IP 基本信息
/********************************************************************************* * EtherNet/IP 基本信 ...
- Excel导入CSV文件中文乱码
参考: iconv -f UTF8 -t GB18030 a.csv >b.csv 或iconv -f UTF-8 -t GB18030 a.csv >b.csv
- find 以及linux 和windows 文件互传
1. find 命令 查找文件或目录 同时也会用到的有 which whereis locate 经常也会遇到一些快捷键 ctrl + l e a w u k ...
- HDU 2561
F - 第二第二 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...
- 用idea编写第一个jsp文件
创建一个JAVA-web项目的前提:1.下载并安装JDK2.安装并配置Tomcat服务器 下面开始创建JAVA-web项目: 1.File——>new——>Project... 2.跟 ...