首页 > 其他分享 >channel

channel

时间:2023-10-08 15:01:44浏览次数:25  
标签:缓冲 goroutine 阻塞 发送者 channel Channel

要点:

1 Channel带不带缓冲

2 谁在发

3 谁在收

4 谁来关

5 关了没

 

Channel有buffer和没有buffer的特点

不带缓冲:要求收发两端都必须要有goroutine否则就是阻塞

有buffer:缓冲没满或者没空之前都不会阻塞,缓冲满了或者空了就会阻塞

 

没有初始化的channel为nil channel 发送和接收都会阻塞

向已经关闭的Channel发送数据会panic 接收数据会返回0

 

channel使用不当会导致goroutine泄露

1只发送不接受,发送者一直阻塞会导致泄露

2只接收不发送,接收值一直阻塞会导致泄露

3读写nil都会导致泄露

基本上可以说,goroutine泄露都是因为goroutine被阻塞之后没有人唤醒它导致的

解决方法:延迟机制,超过一定时间自动关闭;确定管理好发送和接收者避免阻塞的发生

 

channel与内存逃逸

内存分配:

分配到栈上:要知道分配到哪个栈上才会分配到对应的栈上,不需要考虑GC,性能与内存友好

分配到堆上:需要考虑GC

Channel传递指针一定会逃逸因为不知道目标地址无法分配到栈上

 

Channel发送步骤

1. 看是不是 nil channel,是的话直接阻塞
2. 看有没有被阻塞的接受者,有的话直接交付数据,返回
3. 看看缓冲有没有满,没有就放缓冲,返回
4. 阻塞,等待接收者来唤醒自己
5. 被唤醒,做些清理工作

Channel接收步骤

1. 看是不是 nil channel,是的话直接阻塞
2. 看有没有被阻塞的发送者,有的话直接从发送者手里拿,返回
3. 看看缓冲有没有数据,有就读缓冲,返回
4. 阻塞,等待发送者来唤醒自己
5. 被唤醒,做些清理工作

标签:缓冲,goroutine,阻塞,发送者,channel,Channel
From: https://www.cnblogs.com/mengqi-go/p/17749070.html

相关文章

  • golang-channel
    什么是channel管道channel是goroutine与goroutine之间通信的重要桥梁channel是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队列,只不过channel的发送方和接受方是 goroutine 对象,属于内存级别的通信。这里涉及到了goroutine概念,goroutine是轻量级的......
  • DISCO Presents Discovery Channel Code Contest 2020 Qual
    A-DDCCFinals直接模拟即可。#include<iostream>#include<cstdio>usingnamespacestd;intx,y;intmain(){ scanf("%d%d",&x,&y); intans=0; if(x==1)ans+=30; elseif(x==2)ans+=20; elseif(x==3)ans+=10; if(y==1)ans+=30; ......
  • Go - receiving from an empty channel
     packagemainimport("fmt""sync""time")varworkers=3funcprocessItem(input<-chanint,outputchan<-int,wg*sync.WaitGroup){for{fmt.Println("=")in:=<-i......
  • Go - Using channels to receive interrupts in a program
    WithintheKubernetesdeploymentenvironment,applicationswillactuallybesent theSIGTERMsignalfirstifithasbeendecidedthepodholdingtheapplicationneeds tobestopped.Theapplicationmaychoosetorespondtosaidsignalornot.Ifthe appli......
  • RabbitMQ报错:Shutdown Signal: channel error; protocol method
    ShutdownSignal:channelerror;protocolmethod:#method<channel.close>(reply-code=406,reply-text=PRECONDITION_FAILED-unknowndeliverytag1,class-id=60,method-id=80)默认情况下RabbitMQ是自动ACK(确认签收)机制,就意味着MQ会在消息发送完毕后,自动帮我们去AC......
  • 理解并掌握C#的Channel:从使用案例到源码解读(一)
    引言在C#的并发编程中,Channel是一种非常强大的数据结构,用于在生产者和消费者之间进行通信。本文将首先通过一个实际的使用案例,介绍如何在C#中使用Channel,然后深入到Channel的源码中,解析其内部的实现机制。使用案例一:文件遍历和过滤在我们的使用案例中,我们需要遍历一个文件夹及......
  • Netty -- ChannelOption
    1、ChannelOption.SO_BACKLOGChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,函数listen(intsocketfd,intbacklog)用来初始化服务端可连接队列,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候,服务端将不能处......
  • 已解决PackagesNotFoundError: The following packages are not available from curre
    已解决PackagesNotFoundError:Thefollowingpackagesarenotavailablefromcurrentchannels:tensorflo文章目录报错问题解决方法声明报错问题之前在工作中遇到过这个坑,记录一下问题以及解决方法,不一定针对所有情况都能用,但是可以供大家参考。问题描述如下:PackagesNotFoun......
  • 基于channel的异步事件总线
    生成者/消费者概念编程模型通道是生成者/使用者概念编程模型的实现。在此编程模型中,生成者异步生成数据,使用者异步使用该数据。换句话说,此模型将数据从一方移交给另一方。尝试将通道视为任何其他常见的泛型集合类型,例如List。主要区别在于,此集合管理同步,并通过工厂创建选项......
  • 锁表查询,转载 https://www.toutiao.com/article/7275538336188695099/?channel=&sourc
    Oracle死锁与慢查询总结 查看死锁SELECTs.sid"会话ID",s.lockwait"等待锁",s.event"等待的资源/事件",--最近等待或正在等待的资源/事件DECODE(lo.locked_mode,0,'尚未获得锁',1,NULL,2,'行共享锁',3,'行排它锁',4,'共享表锁',5,�......