Go语言协程并发---select多路复用应用
2024-10-19 07:37:53
package main import (
"fmt"
"time"
) /*
·循环从一写两读三条管道中随机选择一条能走的路
·等所有路都走不通了就退出循环
*/ func main041() {
chA := make(chan int, 5) chB := make(chan int, 4)
chB <- 123
chB <- 123
chB <- 123
chB <- 123 chC := make(chan int, 3)
chC <- 123
chC <- 123
chC <- 123 go TaskA(chA)
go TaskB(chB)
go TaskC(chC) time.Sleep(10 * time.Second)
fmt.Println("main over")
} func main() {
chA := make(chan int, 5) chB := make(chan int, 4)
chB <- 123
chB <- 123
chB <- 123
chB <- 123 chC := make(chan int, 3)
chC <- 123
chC <- 123
chC <- 123 OUTER:
for true {
/*随机选择一条能走通的case
所有case都走不通时,走default
可以通过break跳出select,break XXX跳出指定标签*/
select {
case chA <- 123:
fmt.Println("执行任务A")
time.Sleep(time.Second)
case x := <-chB:
fmt.Println("执行任务B", x)
time.Sleep(time.Second)
case <-chC:
fmt.Println("执行任务C")
time.Sleep(time.Second)
default:
fmt.Println("全部任务已结束")
//break//跳出select
break OUTER
}
}
fmt.Println("main over") } func TaskA(ch chan int) {
for true {
fmt.Println("TaskA")
ch <- 123
time.Sleep(time.Second)
} }
func TaskB(ch chan int) {
for true {
fmt.Println("TaskB")
<-ch
time.Sleep(time.Second)
} }
func TaskC(ch chan int) {
for true {
fmt.Println("TaskC")
<-ch
time.Sleep(time.Second)
} }
最新文章
- ABP源码分析三十二:ABP.SignalR
- atexit函数
- firefox浏览器不能使用window.close的解决方案
- Eclipse首字母快捷设置
- ActiveMQ学习(二)——MQ的工作原理
- js获取随机色
- Matlab神经网络工具箱学习之二
- 引用外部CSS的link和import方式的分析与比较
- sql server中分布式查询随笔
- linuxserver启动过程
- Validate Model State automatically in ASP.NET Core 2.0
- 大白话5分钟带你走进人工智能-第十四节过拟合解决手段L1和L2正则
- Git命令使用小结
- nginx与php-fpm通信的两种方式
- 无脑博士的试管们--dfs搜素
- 【mysql】索引优化记录
- 记录.NET Core在CentOS上基于Jenkins自动化发布
- 2019 CCPC wannfly winter camp Day 8
- ORACLE设置密码无过期
- url-pattern / /*匹配