多路复用是通信和网络的一个专业术语,多路复用通常表示在一个信道上传输多路信号或数据流的过程和技术。
提示:
报话机同一时刻只能有一边进行或者发的单边通信,报话机需要准守的通信流程如下:
1、说话方在完成时需要补上一句“完毕”,随后放开通话按钮,从发送切换到接收状态,收听对方说话;
2、收听方在听到对方说“完毕时,按下通话按钮接收切换到发送状态开始说话;
电话可以在说话的同时听到对方说话,所以电话是一种多路复用的设备,一条通信线路上可以同时接收或者发送数据。同样的,网线、光纤也都是基于多路复用模式来设计的,网线、光纤不仅可以支持同时收发数据,还支持多个同时收发数据。
在使用通道时,想同时接收多个通道的数据是一件困难的事情。通道在接收数据时,如果没有数据可以接收将会发生阻塞。虽然可以使用如下模式遍历,但运行性能会非常差。
for{
// 尝试接收ch1通道
data, ok := <-ch1
// 尝试接收ch2通道
data, ok := <-ch2
// 接收后续通道
…
}
操作1、操作2:包含通道收发语句,请参考下表
select 多路复用中可以接收的样式
操 作 | 语句示例 |
接收任意数据 | case <- ch; |
接收变量 | case d := <- ch; |
发送数据 | case ch <- 100; |
1、响应操作1、响应操作2:当操作发生时,会执行执行对应case的响应操作。
2、default:当没有任何操作时,默认执行default中的语句。
可以看出,select不像switch,后面并不带判断条件,而是直接去查看case语句。每一个case语句都必须是一个面向channel的操作。
实例如下:
ch := make(chan int, 1)
for {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println("Value received:", i)
}