Go中的channel是同步还是异步

Go语言中的channel可以是异步也可以是同步,这取决与它是否是一个缓冲的channel

同步channel

无缓冲的channel默认是同步的channel类型,即创建时没有执行缓冲大小。当数据被发送到无缓冲的channel中时,发送者会阻塞直到接受者收到数据。同样,当从无缓冲的channel中接收数据的时候,接受者会阻塞直到发送者发送数据。这种机制允许两个goroutine进行同步的通信。

go 复制代码
package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)

    go func() {
        ch <- 42 // 发送操作会阻塞,直到main goroutine执行接收操作
    }()

    fmt.Println(<-ch) // 接收操作,会阻塞直到有值发送到channel
}

异步的channel

有缓冲的channel是异步的,它拥有一个缓冲队列,创建channel的时候指定队列的大小。发送者向有缓冲的channel发送数据的时候,如果缓冲区未满,则发送就不会阻塞,否则发送者同样会阻塞直到有接受者接收到数据。同样,接收者从有缓冲区的channel接收数据时,如果缓冲中有数据,则接收就不会阻塞,否则接收者会阻塞直到缓冲区有发送者发送数据。

go 复制代码
package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 2) // 创建一个缓冲区大小为2的channel

    // 向channel发送两个数据
    ch <- 1
    ch <- 2

    go func() {
        // 延迟1秒后发送第三个数据,此时发送会阻塞,因为缓冲区已满
        time.Sleep(1 * time.Second)
        ch <- 3
        fmt.Println("Sent 3")
    }()

    // 主goroutine接收数据
    fmt.Println(<-ch) // 接收第一个数据,输出1
    fmt.Println(<-ch) // 接收第二个数据,输出2

    // 第三个接收操作会阻塞,直到发送者发送第三个数据
    fmt.Println(<-ch) // 接收第三个数据,输出3
}

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

相关推荐
GreenTea8 分钟前
AI 时代,工程师的不可替代性在哪里
前端·人工智能·后端
朦胧之28 分钟前
AI 编程开发思维
前端·后端·ai编程
希望永不加班2 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
浮游本尊3 小时前
一次合同同步背后的多阶段流水线:从外部主数据到本地歧义消解
后端
lv__pf3 小时前
springboot原理
java·spring boot·后端
段小二4 小时前
服务一重启全丢了——Spring AI Alibaba Agent 三层持久化完整方案
java·后端
UIUV4 小时前
Go语言入门到精通学习笔记
后端·go·编程语言
lizhongxuan4 小时前
开发 Agent 的坑
后端
段小二4 小时前
Agent 自动把机票改错了,推理完全正确——这才是真正的风险
java·后端