首页 > 其他分享 >Channel

Channel

时间:2024-07-01 22:08:38浏览次数:11  
标签:Received int make intCh chan Channel channel

什么是chanel

用来连接并发的goroutine的,一个goroutine通过chanel向另一个goroutine发送消息,对应的goroutine通过channel来接受消息。

如何定义channel

var <变量名称> chan <数据类型>

var intChan chan int
var strChan chan string
var strChan chan *string
var objChan chan struct{}

channel是引用类型。
需要使用make方法来实例化

make(chan int)   # 不带缓存(buffer)的channel
make(chan int,3) # 带缓存(buffer)的channel
make(chan *string)
make(chan *map[string]struct)

示例

func TestDefChannel(t *testing.T){
	var intCh chan int
	fmt.Println("intChan",intCh) // <nil>
	intCh = make(chan int,1)
	fmt.Println("intCh",intCh) // 0xc**** 
}

Channel特性

1、Channel本质是一个队列,先进先出
2、Channel本身是线程安全的,多个goroutine去操作它,是安全的
3、Channel是数据类型敏感的

示例

func TestDefChannel(t *testing.T){
	intCh := make(chan int,1)
	fmt.Println("intCh",intCh)

	intCh <- 3

	out := <- intCh

	fmt.Println(out)
}

Channel的操作

添加数据
intChan <- 8
取出数据
out <- intChan

func main() {
	// 创建一个不带buffer缓存的channel
	// 该channel用于传递int类型的数据
	IntChan := make(chan int)
	workerCount := 10
	for i := 0; i < workerCount; i++ {
		go func(i int) {
			IntChan <- i
		}(i)
	}
	for j := 0; j < workerCount; j++ {
		go func(j int) {
			// 从IntChan中接收数据
			num := <-IntChan
			// 打印接收到的数据
			fmt.Printf("Received: %d\n", num)
		}(j)
	}
	// 等待所有goroutine完成
	time.Sleep(1 * time.Second)
}
Received: 0
Received: 4
Received: 1
Received: 2
Received: 3
Received: 9
Received: 5
Received: 6
Received: 7
Received: 8

对于没有缓冲区的channel而言,如果没有channel没有出,它是无法写入数据的。

遍历

Channel 只能通过for... range遍历
如果channel没有关闭,也没有数据进入的话,那么就会报错,死锁。
关闭的Channel无法再装入数据,可以继续取数据,直到channel为空

intCh := make(chan int ,10)
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1

for i :=range intCh{
	fmt.Println(i)
}
1
1
1
1
1
1
fatal error: all goroutines are asleep - deadlock!

一定要记得关闭不使用的channel

intCh := make(chan int ,10)
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1
intCh <- 1
close(intCh)

for i :=range intCh{
	fmt.Println(i)
}

或者

func main() {
	intCh := make(chan int, 10)
	intCh <- 1
	intCh <- 1
	intCh <- 1
	intCh <- 1
	intCh <- 1
	intCh <- 1
	close(intCh)

	for {
		if data, ok := <-intCh; ok {
			fmt.Println(data)
		} else {
			fmt.Println("Channel has been closed")
			break
		}
	}
}

标签:Received,int,make,intCh,chan,Channel,channel
From: https://www.cnblogs.com/ykubernetes/p/18278889

相关文章

  • webrtc 的datachannel在golang中的使用
    因为在发送端需要接收一些接收端的统计信息,而且具有不可丢失的需求,所以采取利用datachannel进行传输。datachannel是基于sctp协议的传输通道,sctp可提供按需可靠到达的服务,在datachannel中可以设置是否按序,是否可靠,最大重传次数,数据最大保存时间(当数据超过保存时间仍未发出时将被丢......
  • java java.nio.channels.ClosedChannelException
    java.nio.channels.ClosedChannelException报错信息"java.nio.channels.ClosedChannelException"表示尝试在一个已经关闭的通道上进行操作。在JavaNIO中,通道(Channel)表示一个可以进行IO操作的对象,例如读取或写入数据。当你尝试在一个已经被关闭的通道上进行读取、写入或者其他......
  • 【YOLOv8改进】MLCA(Mixed local channel attention):混合局部通道注意力(论文笔记+引
    摘要本项目介绍了一种轻量级的MixedLocalChannelAttention(MLCA)模块,该模块同时考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果。基于该模块,我们提出了MobileNet-Attention-YOLO(MAY)算法,用于比较各种注意力模块的性能。在PascalVOC和SMID数......
  • 【YOLOv8改进】MLCA(Mixed local channel attention):混合局部通道注意力(论文笔记+引
    摘要本项目介绍了一种轻量级的MixedLocalChannelAttention(MLCA)模块,该模块同时考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果。基于该模块,我们提出了MobileNet-Attention-YOLO(MAY)算法,用于比较各种注意力模块的性能。在PascalVOC和SMID数......
  • 23.EmbeddedChannel
    这个channel可以直接绑定多个handler,不用写服务端代码和客户端代码。便于用于测试。packagecom.xkj.bound;importio.netty.buffer.ByteBufAllocator;importio.netty.channel.ChannelHandlerContext;importio.netty.channel.ChannelInboundHandlerAdapter;importio.n......
  • 问题:如果发送者先运行,而队列是在接收者中定义的,// declare a server-named queue var
    在RabbitMQ中,当你使用交换机(Exchange)和绑定(Binding)时,消息的路由是由交换机类型和绑定键(RoutingKey)来决定的,而不是直接由队列名称来决定的。交换机负责接收生产者发送的消息并根据一定的规则将这些消息路由到一个或多个队列中。问题解释与RabbitMQ的原理发送消息时的行为:发送......
  • [YOLOv10涨点改进:注意力魔改 | 轻量级的 Mixed Local Channel Attention (MLCA),加强通
    本文属于原创独家改进:一种轻量级的MixedLocalChannelAttention(MLCA)模块,该模块考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果1.YOLOv10介绍论文:[https://arxiv.org/pdf/2405.14458]代码:https://gitcode.com/THU-MIG/yolov10?utm_source=c......
  • Flutter-使用MethodChannel 实现与iOS交互
    前言使用MethodChannel在Flutter与原生Android和iOS之间进行通信,可以让你在Flutter应用中调用设备的原生功能。基础概念MethodChannel:Flutter提供的通信机制,允许消息以方法调用的形式在Flutter与原生代码之间传递。方法调用:从Flutter向原生或从原生向Flu......
  • 【YOLOv8改进】CPCA(Channel prior convolutional attention)中的通道注意力,增强特征
    YOLO目标检测创新改进与实战案例专栏专栏目录:YOLO有效改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLO基础解析+创新改进+实战案例摘要医学图像通常展示出低对比度和显著的器官形状变化等特征。现有注意......
  • 【Go-多线程】Golang的channel实现消息的批量处理
    【Go-多线程】Golang的channel实现消息的批量处理。当消息量特别大时,使用kafka之类的messagequeue是首选,但这是更加轻量的方案channelx.go//这个方案需要实现以下几点://1.消息聚合后处理(最大条数为BatchSize),核心://(1)带buffer的channel相当于一个FIFO的队列//(2)多个常驻的gorou......