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)
} }

  

Go语言协程并发---select多路复用应用的更多相关文章

  1. Go语言协程并发---管道信号量应用

    package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...

  2. Go语言协程并发---互斥锁sync.Mutex

    package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...

  3. Go语言协程并发---条件变量

    package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...

  4. Go语言协程并发---读写锁sync.RWMutex

    package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...

  5. Go语言协程并发---等待组sync.WaitGroup

    package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071( ...

  6. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  7. Go语言协程并发---原子操作

    package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操 ...

  8. Go语言协程并发---timer秒表与定时器

    秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...

  9. 多线程、多进程、协程、IO多路复用请求百度

    最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...

随机推荐

  1. Innodb中的快照读和当前读

    一.前言 上篇文章记录了对MVCC的相关理解,其中有提到快照读.其实在MVCC并发控制中,读操作可以分为两类:快照读(snapshot read)和当前读(current read)   二.什么是快 ...

  2. 脱壳——UPX脱壳原理(脱壳helloworld)

    脱壳--UPX脱壳原理 脱壳步骤 1 找到OEP 2 dump(导出)内存文件 3 修复 1 找到OEP 1 程序运行先从壳代码运行,壳代码执行完之后会跳转到真正的OEP,也就是是说第一步,首先要找到 ...

  3. Java IO流知识总结

    Java IO的原理 I/O是Input和Output的缩写,用来处理设备之间的数据传输.如读/写文件,网络通讯等. Java程序中,对于数据的输入/输出操作以"流(stream)" ...

  4. 逆向工程第001篇:解锁FIFA07传奇模式

    FIFA07传奇难度的解锁,可以说是所有FIFA07玩家的终极目标.但是如果想以正常方式对其进行解锁,绝对是一件耗时耗力的工作.所以在这里我打算通过分析游戏存档文件的十六进制代码的方式,一步一步地找到 ...

  5. UVA11039

    题意:      给你一个序列,由n个数字组成,每个数字的绝对值都不相同,然后让你从这n个数中拿出一些数,组成一个绝对值递增并且正负交替的最大序列,问组成的最大序列的最大长度是多少? 思路:     ...

  6. POJ1236 强连通 (缩点后度数的应用)

    题意:       一些学校有一个发送消息的体系,现在给你一些可以直接发送消息的一些关系(单向)然后有两个问题 (1) 问你至少向多少个学校发送消息可以让所有的学校都得到消息 (2) 问至少加多少条边 ...

  7. AWVS扫描器的用法

    目录 AWVS AWVS功能介绍 AWVS如何工作 审核漏洞 AWVS11页面介绍 AWVS11中建立扫描 AWVS10.5中的介绍 AWVS11版本启动失败 利用Burpsuite修改AWVS的数据 ...

  8. AppScan扫描器的用法

    目录 AppScan 软件功能 建立一次基础的扫描 AppScan AppScan是一款非常好用且功能强大的Web 应用安全测试工具,曾以 Watchfire AppScan 的名称享誉业界,AppS ...

  9. UVA11019KMP(二维矩阵匹配出现次数)

    题意:     给你两个矩阵,一个大的一个小的,然后问你这个小矩阵在大的矩阵里出现了多少次? 思路:       说好了AC自动机的,我自己尝试写了个暴力的KMP竟然过了,AC自动机自己的模板还没写完 ...

  10. Windows PE 第四章 导入表

    第四章 导入表 导入表是PE数据组织中的一个很重要的组成部分,它是为实现代码重用而设置的.通过分析导入表数据,可以获得诸如OE文件的指令中调用了多少外来函数,以及这些外来函数都存在于哪些动态链接库里等 ...