Go 缓冲通道(bufchan)用法

胧月线程
• 阅读 993

非缓冲通道:

make(chan T)
一次发送 一次接收 都是阻塞的

缓冲通道:

make(chan T, capacity)
发送:缓冲区数据满了才阻塞
接收:缓冲区数据空了才接收 

举个例子:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    //非缓冲通道
    ch1 := make(chan int)
    fmt.Println(len(ch1), cap(ch1)) //0 0

    //缓存通道
    ch2 := make(chan int, 5)
    ch2 <- 100
    ch2 <- 200
    ch2 <- 300
    ch2 <- 400
    ch2 <- 500
    fmt.Println(len(ch2), cap(ch2))
    fmt.Println("=======================")
    ch3 := make(chan string, 4)
    //    启动一个子协程 放进去ch3
    go sendData(ch3)
    for {
        v, ok := <-ch3
        if !ok {
            fmt.Println("Reading completed ")
            break
        }
        fmt.Println("\tthe data read is : ", v)
    }
    fmt.Println("main-goroutine is finished")
}

func sendData(ch chan string) {
    for i := 0; i < 10; i++ {
        ch <- "Data " + strconv.Itoa(i)
        fmt.Println("子协程写入第 %d 个数据", i)
    }
    close(ch)
}

运行结果是:

0 0
5 5
=======================
子协程写入第 %d 个数据 0
子协程写入第 %d 个数据 1
子协程写入第 %d 个数据 2
子协程写入第 %d 个数据 3
子协程写入第 %d 个数据 4
        the data read is :  Data 0
        the data read is :  Data 1
        the data read is :  Data 2
        the data read is :  Data 3
        the data read is :  Data 4
        the data read is :  Data 5
子协程写入第 %d 个数据 5
子协程写入第 %d 个数据 6
子协程写入第 %d 个数据 7
子协程写入第 %d 个数据 8
子协程写入第 %d 个数据 9
        the data read is :  Data 6
        the data read is :  Data 7
        the data read is :  Data 8
        the data read is :  Data 9
Reading completed 
main-goroutine is finished

其实就是缓冲区大小我们设为4导致的。

参考:bilibili

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Easter79 Easter79
4年前
tcp粘包与udp丢包的原因
tcp粘包与udp丢包的原因一,什么是tcp粘包与udp丢包TCP是面向流的, 流要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送
Wesley13 Wesley13
4年前
javaNio 通道和缓冲区
/大多数操作系统可以利用虚拟内存将文件或文件一部分映射到内存中,然后这个文件就可以被当做内存数组一样被访问;避免底层IO的开销<p【通道】是一种用于磁盘文件的一种抽象;<br它使我们可以访问诸如内存映射,文件加锁机制以及文件间快速数据传递等特性;@date:2018年7月5日
Wesley13 Wesley13
4年前
Java NIO和IO的区别
IO               NIO面向流           面向缓冲阻塞IO           非阻塞IO无               选择器面向流与面向缓冲JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。JavaIO面向流意味着每次从流中
Wesley13 Wesley13
4年前
JAVA NIO(一)
1NIO概述1.1NIO(newIO)是一个可以替代javaIOAPI的API,NIO提供了与标准IO不同的工作方式,标准IO是基于字节流和字符流进行操作的,而NIO是基于channel和Buffer进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写到通道中,方式如例图示,JAVANIO的几个核心组成部分是channels,Buf
Stella981 Stella981
4年前
Netty(二)
一、先讲下NIO编程。NIO(NonblockI/O),亦叫做非阻塞I/O与Socket类和ServerSocket类相对应,NIO也提供了SocketChannel和ServerSocketChannel两种不同的套接字通道实现。1 缓冲区Buffer这里首先介绍缓冲区的概念,NIO和原I/O的一个重要区别就是NIO库中,所有数据都是用缓
Wesley13 Wesley13
4年前
Java.NIO编程一览笔录
Java标准IO与JavaNIO的简单差异示意: Java标准IOJavaNIOAPI调用简单复杂底层实现面向流(stream),单向面向通道(channel),释放CPU、内存压力成效同步阻塞同步非阻塞数据窥视阻塞读取,要么足够,要么没有使用缓冲区(Buffer),读数据时需要检查是否
Wesley13 Wesley13
4年前
NIO通道(channel)原理与获取
一、通道(Channel):用于源节点与目标节点的连接。在javaNIO中负责缓冲区中数据的传输。Channel本身不存储数据,因此需要配合缓冲区进行传输。二、通道的主要实现类java.nio.channels.Channel接口:|–FileChannel|–SocketChannel|–ServerSocketCha
Wesley13 Wesley13
4年前
Java NIO编程学习总结
目录1、同步,异步,阻塞,非阻塞的理解2、什么是BIO、NIO、AIO3、javaNIO常用类和方法介绍3.1.缓冲区Buffer3.2.通道Channel3.2.1FileChannel3.2.2SocketChan
Wesley13 Wesley13
4年前
JAVA NIO 直接缓冲区和非直接缓冲区
前面我们一直说NIO能够提高性能,那么到底如何提高效率。本篇就接着上一篇文章的缓冲区,来看看直接缓冲区和非直接缓冲区。非直接缓冲区首先看看非直接缓冲区。我们之前说过NIO通过通道连接磁盘文件与应用程序,通过缓冲区存取数据进行双向的数据传输。物理磁盘的存取是操作系统进行管理的,与物理磁盘的数据操作需要经过内核地址空间;而我们的Java应用
关于EPOLL触发的事件说明
POLLIN接收缓冲区可读,对端断开及tcp连接也属于可读。LT模式下:接收缓冲区可读就会触发;ET模式:状态改变了,比如接收缓冲区从空不空,才会触发一次读。