029_go语言中的非阻塞通道
2024-10-09 11:16:34
代码演示
package main import "fmt" func main() {
messages := make(chan string)
signals := make(chan bool)
select {
case msg := <-messages:
fmt.Println("received message", msg)
default:
fmt.Println("no message received")
}
msg := "hi"
select {
case messages <- msg:
fmt.Println("sent message", msg)
default:
fmt.Println("no message sent")
}
select {
case msg := <-messages:
fmt.Println("received message", msg)
case sig := <-signals:
fmt.Println("received signal", sig)
default:
fmt.Println("no activity")
}
}
代码运行结果
no message received
no message sent
no activity
代码解读
select中的每个case必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
常规的通过通道发送和接收数据都是阻塞的,但是可以通过带default的select实现非阻塞的发送和接收数据
以上例子通过三个select来演示非阻塞的接收,发送,和多路选择
第一个select是非阻塞接收的例子,由于通道messages中没有值存在,所以select会到default中执行
第二个select是非阻塞发送的例子,这里要注意,由于通道messages在发送前,是一个nil通道,所以case也不会执行
第三个select是一个多路选择的例子
最新文章
- C#抽象方法和虚拟方法理解
- 美国 ZIP Code 一览表
- C# 中反射获取某类的子类和根据类型名动态创建对象
- phpwind9.0模板制作教程——制作论坛风格
- AngularJs $anchorScroll、$controller、$document
- 修改mysql默认字符集的方法
- 【转】用CSS代码写出的各种形状图形的方法
- 13test05:亲密数
- 《跨终端Web》读书笔记
- ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败
- 个人作业1——四则运算题目生成程序(基于C++)
- 凯撒密码加密解密--JAVA实现(基础)
- Django(其二)
- 通信导论-IP数据网络基础(3)
- Ubuntu 18.04 安装Virtual Box or VMWare workstation Pro 14
- gym 101873
- oracle无法启动asm实例记录
- jQuery图片上传前先在本地预览
- H5前端正则验证插件
- python正则二