关于并发进程的一些笔记 | 青训营笔记

223 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

我们评价一个代码的好坏,除了能否运行达到目标、复杂度等要求之外,还有一个最重要的指标——够不够快! 🚀🚀🚀

此时就可以用到并发来使程序高效运行~


什么是并发呢?

并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

说人话23333~

我在电脑上一遍打代码一遍听音乐,这时在电脑上就是并发执行。

下面看大神如何图解并发和并行~

漫话:如何给女朋友解释什么是并发和并行 - 掘金 (juejin.cn)


这时就有聪明的小伙伴问了:你这说一大堆,这玩意要怎么用呢?🙋‍♂️🙋‍♀️

问的好! 下次再继续问~ 下面引入一个关键词:

Goroutine

Goroutine 是Go中最基本的组织单位之一。事实上,每个Go程序至少拥有一个:main goroutine,当程序开始时会自动创建并启动。在几乎所有Go程序中,你都可能会发现自己迟早加入到一个goroutine中。

说人话23333~

简单来说,goroutine 是一个并发的函数和其他代码一起运行,可使用关键词go来创建一个goroutine。 image.png

上图说明:使用for循环执行五次go func() {},每个go func() {}创建了一个goroutine,形成五个hello并发执行,以达到快速打印五次指定内容,返回结果如下图:

image.png


这时又有聪明的小伙伴要问:诶?你这输出顺序不对啊!🙋‍♀️🙋‍♂️

问的好! 下次再继续问~ 下面又要引入一个新概念:

并发安全Lock

高并发场景下,进程、线程(协程)可能会发生资源竞争,导致数据脏读、脏写、死锁等问题,为了避免此类问题的发生,就有了并发安全。

家家户户都有门锁来保证安全,咱们强大的Go语言也不例外。下面介绍一种常用的锁——互斥锁。

互斥锁的使用

image.png

返回结果:

image.png

互斥锁的作用就是在代码上创建一个临界区,保证串行操作(同一时间只有一个 goroutine 执行临界区代码)。


这时就有聪明的小伙伴会说:啊!这也太简单了! 我这就去和别人装b~ 🙋‍♂️🙋‍♀️ヾ(≧▽≦*)o

装的好,下次不许再装了~ 🙅‍♀️🙅‍♂️

学到这里去骗骗小萌新还行,遇到大佬可是会被喷辣鸡代码的~

因为还有最重要的一步:

WaitGroup

WaitGroup可以解决一个 goroutine 等待多个 goroutine 同时结束的场景,常见的场景例如启动了多个worker goruntine 进行并发处理,然后某个goruntine需要汇总信息。

说人话23333~

我们可以理解为,goroutine是基于主线程的一个细小的分支,我们要跑完这个分支,就只能在主线程还未结束时才能跑,一旦主线程跑路了,我们这个小分支失去了依靠,那么就 寄!这时就需要一个人出来拦一拦,而WaitGroup正好就是充当这个角色。🏃‍♀️🏃‍♂️

image.png


学到这里,你就已经初步掌握了Go的并发技巧,如果要深入了解还需继续学习喔~ 👩‍🎓👨‍🎓

如果文章对你有帮助的话记得点个免费的赞~ 👍👍

拒绝白嫖,从我做起!✋✋