首页 > 其他分享 >golang 中 channel cap设为1原理 | 有无缓冲的channel

golang 中 channel cap设为1原理 | 有无缓冲的channel

时间:2024-03-20 23:44:55浏览次数:28  
标签:testing int 缓冲 cap golang func inChan channel

在golang中,如果涉及消息传递或者是并发控制等,我们常常用到 channel,channel的具体原理这里不讨论,今天主要看看有无缓冲以及缓冲值的设计。

无缓冲的channel

联系 channel 的数据结构 mchan 可知,就没得 buf,但 sendq recvq 这些肯定都是有的,所以在无缓冲的 channel 中,如果写者写入 channel 而没有 读者来读取数据的话,这时的写入肯定是阻塞的,同样适用于只有读者没有写者的场景,只有当读者写者都具备的情况下才会正常读写,否则阻塞或者是形成死锁。

下面看几个例子。

同个goroutine中单读channel

func TestNoCacheChanOnlyRd(t *testing.T) {
	inChan := make(chan int, 0)
	<-inChan
}

同个goroutine中单写channel

func TestNoCacheChanOnlyWr(t *testing.T) {
	inChan := make(chan int, 0)
	inChan <- 1
}

同个goroutine中有写有读

func TestNoCacheChanWrAndRd(t *testing.T) {
	inChan := make(chan int, 0)
	inChan <- 1
	<-inChan
}

不同goroutine中读写

func TestNoCacheChanWrAndRdInDiffGoroutine(t *testing.T) {
	inChan := make(chan int)
	go func() {
		fmt.Println("写入到num:", 1)
		inChan <- 1
		close(inChan)
	}()
	go func() {
		num := <-inChan
		fmt.Println("读取到num:", num)
	}()

	time.Sleep(time.Second)
	fmt.Println("主进程退出")
}

除了最后一个情况,其他情况全部都是要 deadLock 的,不信可以自己运行下。

有缓冲的channel

标签:testing,int,缓冲,cap,golang,func,inChan,channel
From: https://www.cnblogs.com/davis12/p/18086394

相关文章

  • golang 多返回值的实现原理-转载
    之前一次面试时,面试官问到你知道golang的多返回值的实现吗,一脸懵逼,平时主要注重项目应用开发,对这块确实没关注,答得不好,各位大佬,以后建议也加强下基础哦。今天看看golang中多返回值的实现。可以简单认为c中多返回值的实现,其实就是通过寄存器将返回参数以指针形式传入传入参......
  • golang vs python 应用项目语言选择
    目录1.语言选择2.python语言特点及应用场景2.1语言特点1.简单2.易于学习3.自由且开放4.丰富的库5.互动模式6.跨平台性7.可扩展8.数据库9.可嵌入10.高级语言2.2应用场景Python在系统编程中的应用Python在网络爬虫方面的应用Python在人工智能、科学计算中的应用Python在WEB开发中......
  • golang 运行时死锁排查和检测
    当运行的系统发生goroutine等待获取锁时间超过预期时,判定为发生了死锁。因目前代码中使用了一些公开的锁实例,调用链也比较长,对问题排查带来了很大困扰。为了便于问题排查,需要借助工具来实现。1.发生死锁的判定依据和原因1.1判定依据如下为使用Mutex锁产生的锁等待,并持续了2......
  • JAVA学习-NIO.Channel(通道)
        在JavaNIO中,Channel(通道)是用于在文件、套接字、管道等之间进行数据传输的对象,它类似于传统IO中的流。通道可以用于读取和写入数据,并且可以同时进行读写。一、JavaNIO中提供了几种类型的通道,主要有以下几种:1.FileChannel:用于对文件进行读写操作的通道。2.Da......
  • golang实现数据分组
    背景:从数据库里查出了532条数据,这532条数据需要通过一个接口过滤符合条件的,由于过滤比较流程长,过滤接口避免超时,只允许一次请求100条,于是我们就需要针对这个532条数据进行分组。思路:就是把这个数据分成6组,前5组是100条,第6组是32条。max=532/100取整,532%100不等于零max+1,创建一个......
  • golang sync.Map之如何设计一个并发安全的读写分离结构?
    在golang中,想要并发安全的操作map,可以使用sync.Map结构,sync.Map是一个适合读多写少的数据结构,今天我们来看看它的设计思想,来看看为什么说它适合读多写少的场景。如下,是golang中sync.Map的数据结构,其中属性read是只读的map,dirty是负责写入的map,sync.Map中的键值对value......
  • Golang案例开发之gopacket监听网卡抓包(2)
    文章目录前言二、实践监听网卡抓包1.代码2.知识点OpenLive方法SetBPFFilter断言总结前言本节实战,监听指定网卡,进行网络抓包,根据分层,解析不同分层包的内容。二、实践监听网卡抓包1.代码代码如下(示例):packagemainimport( "fmt" "log" "......
  • Golang多线程打印ABC
    packagemainimport("fmt""sync")funcThreeG(){varch1,ch2,ch3=make(chanstruct{}),make(chanstruct{}),make(chanstruct{})varwgsync.WaitGroupwg.Add(3)gofunc(sstring){deferwg.Done......
  • golang fasthttp服务端的简单实现
    使用示例:packagemainimport("github.com/buaazp/fasthttprouter""github.com/valyala/fasthttp""log")funcmain(){//创建路由r:=fasthttprouter.New()r.GET("/",Index)iferr:=fasthttp.Listen......
  • 【golang语言】
    目录数据类型基础数据类型boolstringintint8int16int32int64uintuint8uint16uint32uint64uintptrbyterunefloat32float64complex64complex128类型转换go语言不允许隐式转换别名类型和原有类型也不能进行隐式转换类型的预定义值......