这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
我们评价一个代码的好坏,除了能否运行达到目标、复杂度等要求之外,还有一个最重要的指标——够不够快! 🚀🚀🚀
此时就可以用到并发来使程序高效运行~
什么是并发呢?
并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
说人话23333~
我在电脑上一遍打代码一遍听音乐,这时在电脑上就是并发执行。
下面看大神如何图解并发和并行~
这时就有聪明的小伙伴问了:你这说一大堆,这玩意要怎么用呢?🙋♂️🙋♀️
问的好! 下次再继续问~ 下面引入一个关键词:
Goroutine
Goroutine 是Go中最基本的组织单位之一。事实上,每个Go程序至少拥有一个:main goroutine,当程序开始时会自动创建并启动。在几乎所有Go程序中,你都可能会发现自己迟早加入到一个goroutine中。
说人话23333~
简单来说,goroutine 是一个并发的函数和其他代码一起运行,可使用关键词go来创建一个goroutine。
上图说明:使用for循环执行五次go func() {},每个go func() {}创建了一个goroutine,形成五个hello并发执行,以达到快速打印五次指定内容,返回结果如下图:
这时又有聪明的小伙伴要问:诶?你这输出顺序不对啊!🙋♀️🙋♂️
问的好! 下次再继续问~ 下面又要引入一个新概念:
并发安全Lock
在高并发场景下,进程、线程(协程)可能会发生资源竞争,导致数据脏读、脏写、死锁等问题,为了避免此类问题的发生,就有了并发安全。
家家户户都有门锁来保证安全,咱们强大的Go语言也不例外。下面介绍一种常用的锁——互斥锁。
互斥锁的使用
返回结果:
互斥锁的作用就是在代码上创建一个临界区,保证串行操作(同一时间只有一个 goroutine 执行临界区代码)。
这时就有聪明的小伙伴会说:啊!这也太简单了! 我这就去和别人装b~ 🙋♂️🙋♀️ヾ(≧▽≦*)o
装的好,下次不许再装了~ 🙅♀️🙅♂️
学到这里去骗骗小萌新还行,遇到大佬可是会被喷辣鸡代码的~
因为还有最重要的一步:
WaitGroup
WaitGroup可以解决一个 goroutine 等待多个 goroutine 同时结束的场景,常见的场景例如启动了多个worker goruntine 进行并发处理,然后某个goruntine需要汇总信息。
说人话23333~
我们可以理解为,goroutine是基于主线程的一个细小的分支,我们要跑完这个分支,就只能在主线程还未结束时才能跑,一旦主线程跑路了,我们这个小分支失去了依靠,那么就 寄!这时就需要一个人出来拦一拦,而WaitGroup正好就是充当这个角色。🏃♀️🏃♂️
学到这里,你就已经初步掌握了Go的并发技巧,如果要深入了解还需继续学习喔~ 👩🎓👨🎓
如果文章对你有帮助的话记得点个免费的赞~ 👍👍
拒绝白嫖,从我做起!✋✋