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

相关推荐
苏三说技术8 分钟前
千万级大表,如何做性能优化?
后端
AKAMAI14 分钟前
什么是云原生应用?
后端·云原生·云计算
mxpan15 分钟前
golang 一种并发安全 map 的实现
开发语言·golang
bug菌16 分钟前
一致性设计选择:不同业务场景下,如何做“取舍”?
分布式·后端·架构
Apifox29 分钟前
Apifox SEO 设置全解析:让你的 API 文档更容易被搜到
前端·后端·测试
bobz96531 分钟前
vscode C|C++ 跳转
后端
文赋AI34 分钟前
爆火的DeepSeek到底是啥?一篇文章带你摸透这个AI界黑马!
后端
松果集35 分钟前
【Python3】从任意长度的可迭代对象中分解元素
后端
前端付豪37 分钟前
微信多端会话一致性揭秘:设备同步、状态冲突与消息幂等设计实战
前端·后端·架构
用户914536330839140 分钟前
Java Optional:优雅处理空值的最佳实践
后端