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. 基于ASP.NET Core 3.0快速搭建Razor Pages Web应用

    前言 虽然说学习新的开发框架是一项巨大的投资,但是作为一个开发人员,不断学习新的技术并快速上手是我们应该掌握的技能,甚至是一个.NET Framework开发人员,学习.NET Core 新框架可以更 ...

  2. luogu P3913 车的攻击 |数学

    题目描述 N×N 的国际象棋棋盘上有KK 个车,第ii个车位于第R_i行,第C_i列.求至少被一个车攻击的格子数量. 车可以攻击所有同一行或者同一列的地方. 输入格式 第1 行,2 个整数N,K. 接 ...

  3. CodeForces-Round524 A~D

    A. Petya and Origami time limit per test  1 second   memory limit per test  256 megabytes input stan ...

  4. ARTS-S docker ceontos镜像中使用crontab

    centos镜像中默认没有crontab,需要在dockerflle中通过yum的安装 yum -y install vixie-cron crontabs && yum clean ...

  5. HtmlAgilityPack 获取节点的子节点

    这个问题真的是好无语 var table = doc.DocumentNode.SelectSingleNode("//table[@class='ddd']"); var a = ...

  6. Docker--DockerFile创建自己的image

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 在我们 ...

  7. rails gem ransack 之模糊搜索

    gem 'ransack' eq: "等于" eq_any: "等于任意值" eq_all: "等于所有值" not_eq: "不 ...

  8. JS实现链式调用 a().b().c()

    function a() { this.b = function () { console.log('111') return this } this.c = function () { consol ...

  9. CentOS 7.4搭建LAMP,LAMP:Linux、Apache、MySQL、PHP

    CentOS 7.4搭建LAMP,LAMP:Linux.Apache.MySQL.PHP. 目录: 第一部分 准备工作 第二部分 安装Apache服务 第三部分 安装MySQL服务 第四部分 搭建PH ...

  10. 【RabbitMQ】显示耗时处理进度

    [RabbitMQ]显示耗时处理进度 通过网页提交一个耗时的请求,然后启动处理线程,请求返回.处理线程每完成一部分就给前台推送完成的数量,前端显示进度. 依赖jar <?xml version= ...