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

相关推荐
天天摸鱼的java工程师20 小时前
JDK 25 到底更新了什么?这篇全景式解读带你全面掌握
java·后端
非鱼feiyu20 小时前
自关联数据表查询优化实践:以 Django + 递归 CTE 构建树结构为例
数据库·后端·django
零日失眠者20 小时前
这5个Python库一旦掌握就离不开
后端·python
幌才_loong20 小时前
.NET8 × Redis 实战宝典:从配置到落地,搞定高并发缓存就这篇!
后端·.net
用户83562907805120 小时前
如何使用 Python 从 Word 文档中批量提取表格数据
后端·python
l***370920 小时前
spring 跨域CORS Filter
java·后端·spring
aiopencode21 小时前
APP 公钥与 MD5 信息在工程中的价值 一次签名排查过程带来的经验总结
后端
ServBay21 小时前
Django 6.0 发布,新增原生任务队列与 CSP 支持
后端·python·django
用户21903265273521 小时前
Spring Boot 4.0 整合 RabbitMQ 注解方式使用指南
后端
PPPPickup1 天前
easychat---创建,获取,获取详细,退群,解散,添加与移除群组
java·开发语言·后端·maven