go中有缓存通道和无缓存通道区别
golang channel 有缓冲 与 无缓冲 是有重要区别的
我之前天真的认为 有缓冲与无缓冲的区别 只是 无缓冲的 是 默认 缓冲 为1 的缓冲式
其实是彻底错误的,无缓冲的与有缓冲channel有着重大差别
那就是一个是同步的 一个是非同步的
怎么说?比如
c1:=make(chan int) 无缓冲
c2:=make(chan int,1) 有缓冲
c1<-1
无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着
而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。
打个比喻
无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。
无缓冲保证信能到你手上
有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。
有缓冲的 保证 信能进你家的邮箱
看测试代码
有缓冲的
1 package main 2 3 import "fmt" 4 5 var c = make(chan int, 1) 6 7 func f() { 8 9 c <- 'c' 10 11 fmt.Println("在goroutine内") 12 } 13 14 func main() { 15 go f() 16
17 c <- 'c' 18 <-c 19 <-c 20 21 fmt.Println("外部调用") 22 }
无缓冲的
// pp package mainimport ("fmt" ) func writeRoutine(test_chan chan int, value int) { test_chan <- value } func readRoutine(test_chan chan int) { <-test_chan return } func main() { c := make(chan int) x := 100 //readRoutine(c) //go writeRoutine(c, x) //writeRoutine(c, x) //go readRoutine(c) //go readRoutine(c) //writeRoutine(c, x) go writeRoutine(c, x)
go writeRoutine(c, x)readRoutine(c)fmt.Println(x) }
可以在部分代码注释掉,看效果,再体会下
转载于:https://www.cnblogs.com/Ellon-Daris/p/5403846.html
go中有缓存通道和无缓存通道区别相关推荐
- Go 学习笔记(25)— 并发(04)[有缓冲/无缓冲通道、WaitGroup 协程同步、select 多路监听通道、close 关闭通道、channel 传参或作为结构体成员]
1. 无缓冲的通道 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道. 这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能 ...
- Golang通道的无阻塞读写的方法示例
无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯一的解决办法,那就是使用select结构. 这篇文章会介绍,哪些情况会存在阻塞,以及如 ...
- golang的Channel初始化的有缓存与无缓存解释
首先编程的时候遇到疑问,输出跟我所想预想不一样,后来查到了golang社区的帖子,其中一篇帖子 :健哥大人 做出了一些解释. 我摘抄重点过来: 无缓冲的与有缓冲channel有着重大差别,那就是一个 ...
- 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完 ...
- Hyperledger Fabric无系统通道启动及通道的创建和删除
前言 在Hyperledger Fabric组织的动态添加和删除中,我们已经完成了在运行着的网络中动态添加和删除组织,但目前为止,我们启动 orderer 节点的方式都是通过系统通道的方式,这样自带系 ...
- [GO]无缓冲通道(unbuffered channel)
无缓冲通道(unbuffered channel)是指在接收前没有能力保存任何值的通道,在之前的例子中使用的都是无缓冲通道,需要注意的是,对于无缓冲通道而言,不管是往通道里写数据还是从通道里读数据,都 ...
- 程序员面试金典——17.1无缓存交换
程序员面试金典--17.1无缓存交换 主要是利用异或性质~ 程序员面试金典--17.1无缓存交换 class Exchange { public:vector<int> exchangeA ...
- 全缓存、行缓存和无缓存
在标准I/O中,核心对象是流.所谓流,它是一个过程,所有的I/O操作都是简单的从程序的移进或移出,我们把这种字符流叫做流.标准I/O基于流的操作都是缓存文件系统. 缓存类型分为三种,分别是全缓存.行缓 ...
- 宇视IPC9312I-FW通道2无录像
IPC9312I-FW通道2无录像问题解决方法 1:组网 IPC9312I-FW-AUKCF28-2F60-DT CIPC-B2302.3.86.L01.220423-宇视云-智U 2:问题现象 IP ...
最新文章
- i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核
- 迁移学习:如何使用TensorFlow对图像进行分类
- Android Telephony分析(五) ---- TelephonyRegistry详解
- 百度安全 Rust TrustZone SDK正式成为 Apache Teaclave 子项目
- thinkphp curd的事务回滚 一看就会
- python怎样定义一个数组_python如何建立全零数组
- 十分钟学习python_10分钟带你入门Cython
- 在IDEA中解决jar包冲突的神操作-必看,秒杀市面方法
- 基于Vue的16个UI框架集锦
- [linux]linux mint zsh安装和配置
- 分享三大外汇日内交易策略
- 首先提出电子计算机存储程序的科学家,1、世界上首先实现存储程序的电子数字计算机是___C_。.doc...
- Axure实战——实现登录注册功能
- 在滴滴云 DC2 云服务器上搭建 ELK 日志采集系统
- python米和厘米转换代码_用Python写一个朴素的长度单位转换器
- Unity制作自定义消息提示框
- Learning Python 学习Python Lynda课程中文字幕
- 客户端Git安装教程
- 故障处理 软件 需求_一分钟了解软件测试类型
- Notice: Use of undefined constant MCRYPT_RIJNDAEL_128 - assumed ‘MCRYPT_RIJNDAEL_128‘ in
热门文章
- HDU 5514 Frogs (容斥原理+因子分解)
- CentOSserverMysql主从复制集群结构
- inux读取ISO文件或是光驱的方法--挂载
- UICollectionView实现的图片的多选效果(本人已封装好,简单操作)
- Android香露刀之SeekBar之双管齐下
- pass information between XXX.Aspx and XXX.Aspx.cs
- Spring源码分析-深入理解生命周期之BeanFactoryProcessor
- 图片和图形之性能和视图层次结构(18)
- 《影响力》承诺和一致原理深入剖析,人们对自己的选择是很相信的
- 利用Java生成静态HMTL页面的方法收集