Go有无缓冲channel的区别

无缓冲的channel

channel的默认类型就是无缓冲的。当一个数据被发送到无缓冲的channel中,发送操作会被阻塞,知道有另一个goroutine从这个channel中接收这个数据。同样,当试图从一个无缓冲的channel中接收数据时,如果没有数据可以接收,接收操作也会被阻塞,直到有另一个goroutine发送数据到这个channel。因此,无缓冲的channel提高了一种强同步的通信机制,发送和接收操作在完成数据交换的时候都会阻塞,确保了数据在不同的goroutine之间精确同步。

有缓冲的channel

有缓冲的channel具有一个固定大小的缓冲区。当数据被发送到有缓冲的channel时,如果缓冲区未满,发送操作就会立刻返回,否则发送操作会阻塞,直到有另一个goroutinechannel中接收数据病空出空间。当从一个有缓冲的channel接收数据的时候,如果缓冲区有数据,接收操作会被立刻返回,否则接收操作会阻塞,直到有另一个goroutine发送数据到channel。因此,有缓冲的channel提供了一种弱同步的通信机制,发送和接收操作可能不会阻塞,是的goroutine可以继续执行其他的操作。

使用场景

  • 无缓冲的channel 适用于确保两个goroutine必须同步进行的场景,比如确保某个事件发生后才进行下一步操作。
  • 有缓冲的channel 适用于想要减少因等待而导致的阻塞的场景,或者当数据生产速度不定时,缓冲可以帮助平滑数据流动和处理。

以下是一个使用示例,无缓冲的情况下,发送操作会阻塞,因此打印操作也无法执行,直到接收操作完成;而有缓冲的情况下,发送操作不会阻塞,所以会继续向下执行打印操作。

package main

import (
	"fmt"
	"time"
)

func main() {
	// 无缓冲的channel
	unbuffered := make(chan string)
	go func() {
		unbuffered <- "Hello, World!"
		fmt.Println("Sent message to unbuffered channel!")
	}()
	// 模拟处理延迟
	time.Sleep(3 * time.Second)
	fmt.Println(<-unbuffered)

	// 有缓冲的channel
	buffered := make(chan string, 1)
	go func() {
		buffered <- "Hello, World!"
		fmt.Println("Sent message to buffered channel!")
	}()
	// 模拟处理延迟
	time.Sleep(3 * time.Second)
	fmt.Println(<-buffered)
}

最后给大家推荐一个LinuxC/C++高级架构系统教程的学习资源与课程,可以帮助你有方向、更细致地学习C/C++后端开发,具体内容请见 https://xxetb.xetslk.com/s/1o04uB

相关推荐

  1. Go缓冲channel区别

    2024-05-12 09:52:10       28 阅读
  2. 缓冲channel缓冲channel

    2024-05-12 09:52:10       59 阅读
  3. Go缓冲通道与容量为1缓冲通道区别

    2024-05-12 09:52:10       35 阅读
  4. Go语言中Channel

    2024-05-12 09:52:10       52 阅读
  5. go 语言中 channel 简单介绍

    2024-05-12 09:52:10       51 阅读
  6. 极与极电容区别

    2024-05-12 09:52:10       23 阅读
  7. Go语言中如何设置channel缓冲区大小

    2024-05-12 09:52:10       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 09:52:10       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 09:52:10       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 09:52:10       82 阅读
  4. Python语言-面向对象

    2024-05-12 09:52:10       91 阅读

热门阅读

  1. gin:01-框架安装

    2024-05-12 09:52:10       32 阅读
  2. Python中的多线程与多进程编程:深入解析与应用

    2024-05-12 09:52:10       37 阅读
  3. c语言之打开一个文件

    2024-05-12 09:52:10       28 阅读
  4. 00 深度学习 PyTorch框架介绍

    2024-05-12 09:52:10       33 阅读
  5. Spring如何解决循环依赖

    2024-05-12 09:52:10       27 阅读
  6. SD321放大器3V输入电流电压保护二极管25C电源电流

    2024-05-12 09:52:10       35 阅读
  7. react Hooks

    2024-05-12 09:52:10       31 阅读
  8. React Native vs Flutter:2023年移动开发框架对比

    2024-05-12 09:52:10       25 阅读
  9. React Native跨平台开发实战:从零到一

    2024-05-12 09:52:10       37 阅读
  10. 学习Vue3中reactive

    2024-05-12 09:52:10       28 阅读
  11. Docker在macbook搭建lnmp环境

    2024-05-12 09:52:10       31 阅读