golang的缓冲channel简单使用


我们常用的是无缓冲channel :

make(chan type)

其实make() 创建chan的第二个参数可设置缓冲channel的大小。

上述语句等价于 make(chan type, 1) 即创建了一个缓冲区大小为1channel

下面看有缓冲channel的两个例子.

阻塞型

demo :

协程1 :每隔1s 往有10个缓冲的channel里面写一条msg,

协程2:每隔3s 取一条msg,

package main 

import(
//"fmt"
"time"
"strconv"
log "github.com/astaxie/beego/logs"
) func main() {
log.Debug("---main--- start") msgs := make(chan string, 10) i := 0 go func() {
time.Sleep(3*time.Second) for {
time.Sleep(1*time.Second)
i++
msg := "msg " + strconv.Itoa(i)
msgs <- msg
log.Debug("------ put msg : ", msg)
}
}() go func() { for { get := <- msgs log.Debug("---------------- pop msg : ", get) time.Sleep(3*time.Second)
} }() time.Sleep(100*time.Second) }

可以看到当缓冲区满了以后,写channel的操作会阻塞在那里等待读端取走msg后才能写入。

非阻塞

实际场景中我们可能不希望程序阻塞,那么可以使用select来控制,当缓冲区满了后忽略该条msg继续执行我们的程序。

package main 

import(
//"fmt"
"time"
"strconv"
log "github.com/astaxie/beego/logs"
) func main() {
log.Debug("---main--- start") msgs := make(chan string, 3) i := 0 go func() {
time.Sleep(3*time.Second) for { time.Sleep(1*time.Second)
i++
msg := "msg " + strconv.Itoa(i) select {
case msgs <- msg:
log.Debug("------ put msg : ", msg)
default :
log.Debug("-----msgs chan cache full sleep 1s-----")
log.Debug("-----ignore this msg-----> : ", msg)
}
}
}() go func() { for { get := <- msgs log.Debug("---------------- pop msg : ", get) time.Sleep(3*time.Second)
} }() time.Sleep(100*time.Second) }

可以看到,因为写端写入过快,再写入msg6时缓冲区已满,执行default丢弃了msg6,读端在取走msg5后, 取走的不是msg6,而是msg7

golang的缓冲channel简单使用的更多相关文章

  1. golang 无缓冲channel

    golang 无缓冲channel package main import "fmt" func main() { // 1S =1000ms //1ms = 1000us //1 ...

  2. golang的缓冲channel和无缓冲channel的区别

    话说golang的channel同步的定义真是让人无力吐槽,码农的用户体验就这么难搞么,超耐磨阿,无缓冲和缓冲居然有这么大区别....靠 转载一段网上的资料 --------------------- ...

  3. go之无缓冲channel(通道)和有缓冲channel(通道)

    channel我们先来看一下通道的解释:channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度.chann ...

  4. go语言之进阶篇有缓冲channel

    1.有缓冲channel 示例:  有缓存会阻塞,当读取完其中数值时,又可以写入. package main import ( "fmt" "time" ) f ...

  5. go语言之进阶篇无缓冲channel

    1.无缓冲channel 示例: package main import ( "fmt" "time" ) func main() { //创建一个无缓存的ch ...

  6. Go语言中的有缓冲channel和无缓冲channel区别

    Go语言中的有缓冲channel和无缓冲channel区别 结论 ch1:=make(chan int)// 无缓冲 ch2:=make(chan int,1)// 有缓冲 无缓冲: 当向ch1中存值 ...

  7. golang 如何查看channel通道中未读数据的长度

    可以通过内建函数len查看channel中元素的个数. 内建函数len的定义如下: func len(v Type) int The len built-in function returns the ...

  8. Golang(九)简单 Goroutine 池实现

    0. 前言 最近使用 Golang 写一个并发执行的测试脚本 之前习惯使用 Java,习惯性想先建一个线程池.然后意识到 Golang 没有封装好的线程池 结合之前学习的 Goroutine 原理和 ...

  9. Golang 绘图基础 -绘制简单图形

    前一节讲的是 绘图到不同输出源,请看地址: http://www.cnblogs.com/ghj1976/p/3440856.html 上一节的例子效果是通过设置每一个点的的RGBA属性来实现的,这是 ...

随机推荐

  1. 不止面试-JVM垃圾回收面试题详解

    第一部分:面试题 本次分享我们将尝试回答以下问题: GC 是什么? 为什么要有 GC? 简单说一下java的垃圾回收机制. JVM的常见垃圾回收算法有哪些? 为什么要使用分代回收机制? 如何判断一个对 ...

  2. 宜信SDL实践:产品经理如何驱动产品安全建设

    一.序言 本文从产品经理的角度出发,对产品经理的安全职责.产品驱动安全的内涵.工作内容.工作方法.所需安全资源.以及产品经理的安全工作量进行了分析.希望所有产品经理在没有心理负担的情况下,有目标.有方 ...

  3. 移动开发在路上-- IOS移动开发系列 网络交互四(2)

    接着上次的讲,这次我们讲 网络请求的封装  打开创建的项目,让我们一起来继续完成他, 首先我们来创建一个NSobject 的文件 圈住出来的轻一点要注意.千万不要搞错了 创建好之后,开始编写代码, 我 ...

  4. HDU2255 奔小康赚小钱钱(二分图-最大带权匹配)

    传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子 ...

  5. CodeForces985C-Liebig's Barrels

    描述 题解 二分加贪心.先确保前 ii 桶可以分配为相邻的 kk 个,并且保证 a[i∗k+j]−a[1]<=la[i∗k+j]−a[1]<=l,这样就能保证所有的差不大于 ll,如果不能 ...

  6. 将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题

    需求: 数据库使用飘雪算法保存唯一标识  是一个18位长整形 将数据输出到浏览器时出现了精度丢失问题,这是一个重大的BUG.如果没解决好整个项目都要改一遍. 讨论有三个办法 1.把所有实体 数据模型的 ...

  7. FlyWay工作原理

    本文译自Flyway官方文档,原文地址https://flywaydb.org/getstarted/how 当你最开始将FlyWay指向一个空数据库时. 它会试着去查找schema历史表,如果此时数 ...

  8. 【C语言】%f,%lf,%3.1f

    在输出时应注意变量类型,使用如%3.1时会默认四舍五入.

  9. 使用FileReader在浏览器读取预览文件(image和txt)

    如标题,之前在某个地方看到因为有Blob的存在,理论上可以在浏览器上查看所有格式的文件.自己想着试试现在暂时只能够查看图片和预览txt文件.其他的比如doc,docx格式的文件查看的时候是乱码 如图: ...

  10. Rabbitmq-单机安装

    Rabbitmq介绍   官网地址:https://www.rabbitmq.com RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件.它轻量级.易部署.并支持多种协议.它基于Erl ...