多路复用(Multiplexing)通常指的是通过 select 语句来同时监听多个通道的操作。简单来说,就是在一个地方等待多个通道中的任意一个有消息到来,一旦有消息到来,就执行相应的操作。
package main
import (
"fmt"
"time"
)
func main() {
//创建两个无缓冲的通道ch1 ch2
ch1 := make(chan string)
ch2 := make(chan string)
/*go func() {...}() 的语法是为了创建一个新的 goroutine(轻量级线程),
并在其中执行函数中的代码。通过这种方式,可以实现并发执行,使得程序能够同时执行多个任务而不会被阻塞。
time.Sleep(1 * time.Second)
在并发程序中,有时需要控制各个 goroutine 之间的执行顺序和速度
在并发程序中,某些操作可能会导致资源竞争,通过在 goroutine 中使用 time.Sleep 可以间接地减少竞争条件的发生,从而提高程序的稳定性。
*/
go func() {
for {
time.Sleep(1 * time.Second)
ch1 <- "from ch1"//发送数据from ch1到ch1通道中
}
}()
go func() {
for {
time.Sleep(2 * time.Second)
ch2 <- "from ch2"发送数据from ch2到ch2通道中
}
}()
for {
select {
case msg1 := <-ch1://接收ch1通道传来的数据
fmt.Println("ch1:", msg1)//输出
case msg2 := <-ch2://接收ch2通道传来的数据
fmt.Println("ch2:", msg2)//输出
}
}
/*这样写的好处在于:
使用无限循环 for { ... } 结合 select 可以持续监听多个通道,保证程序能够持续接收和处理消息。
这段代码可以用于并发场景下的消息处理,比如同时从多个通道接收消息,并对消息进行处理。一旦有消息到达,就会立即进行处理,而不必等待其他通道。
*/
}