Go并发编程之四

编程入门 行业动态 更新时间:2024-10-11 23:15:39

Go并发编程<a href=https://www.elefans.com/category/jswz/34/1767787.html style=之四"/>

Go并发编程之四

一、前言

今天我们介绍一下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中也差不多。这是本经典书,很多年以前看过几页,也只看了几页。

更多推荐

Go并发编程之四

本文发布于:2023-12-05 12:23:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1664204.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:之四

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!