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

相关推荐
2401_857622664 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589364 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没5 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch6 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
怪我冷i7 小时前
使用vscode调试wails项目(golang桌面GUI)
vscode·golang
杨哥带你写代码7 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
AskHarries8 小时前
读《show your work》的一点感悟
后端
A尘埃8 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23078 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
Marst Code8 小时前
(Django)初步使用
后端·python·django