网站制作教程迅雷下载,网站宣传工作,app软件定制开发企业,哔哩哔哩网站建设分析一、前言
今天我们介绍一下Go并发编程另外一个重要概念【多路复用】#xff0c;多路复用最开始是在网络通讯领域#xff08;硬件#xff09;应用#xff0c;指的是用同一条线路承载多路信号进行通信的方式#xff0c;有频分多路复用、时分多路复用等等技术#xff0c;然…一、前言
今天我们介绍一下Go并发编程另外一个重要概念【多路复用】多路复用最开始是在网络通讯领域硬件应用指的是用同一条线路承载多路信号进行通信的方式有频分多路复用、时分多路复用等等技术然后扩展到操作系统软件层面HTTP2协议为什么这么快关键一点就是用了多路复用技术关于HTTP2多路复用可以看 HTTP2入门、 HTTP2多路复用原理以及gRPC抓包分析 这两篇文章。
二、Go并发为何要用多路复用
我们用一个例子来说明要用多路复用原因程序中创建了三个goroutine分别执行三个不同任务花费时间分别是10毫秒、1毫秒、2毫秒然后任务执行完后获取任务的输出结果。 执行结果如下 可以看到整个执行花费了10秒多这样写的代码是有问题的我第2个任务其实只需要1秒钟但这个代码从ch1通道获取数据因为oneRoutine任务执行时间很长会造成ch1通道阻塞而ch1通道阻塞整个主goroutine就阻塞了ch2和ch3这两个通道有数据但被ch1给阻塞了要解决这个问题就要用到多路复用select了。
三、加上多路复用代码
我们更改一下上面的程序,三个任务函数oneRoutine、twoRoutine、threeRoutine不变在从通道获取数据时加上select代码。 执行结果 这样ch2和ch3通道有数据就能立即返回而不会受到ch1通道阻塞的影响。
注select会及时响应每一个就绪的channel另外还可以用select 来处理超时的情况当通道一直没有数据就绪超过3秒钟就执行另外一条case避免程序一直等待。 注在Unix网络编程中其实也有讲到I/O复用模型select poll函数概念和Go中也差不多。这是本经典书很多年以前看过几页也只看了几页。