Go语言协程并发---select多路复用应用

Posted yunweiqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言协程并发---select多路复用应用相关的知识,希望对你有一定的参考价值。

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多路复用应用的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程中的多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

Go基础并发编程

Go基础并发编程

IO多路复用/基于IO多路复用+socket实现并发请求/协程

[日常] Go语言圣经-基于select的多路复用习题

IO多路复用, 基于IO多路复用+socket实现并发请求(一个线程100个请求), 协程