并发编程 | 青训营笔记

68 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

在实际的工程项目中,仅仅只有基础语法肯定是不够的。并发编程和依赖管理都是工程中必不可少的,本文将记录整理工程进阶课程中关于并发编程的笔记。

协程Goroutine

Go协程(goroutine)是指在后台中运行的轻量级执行线程,go协程是Go中实现并发的关键组成部分。

在Go语言中通过使用关键字go来创建协程,当我们在函数或方法的调用之前添加一个关键字 go时就开启了一个协程,该函数或者方法就会在这个Go协程中运行。

_注意:_Go协程总是在后台运行,当一个 Go协程执行的时候,Go不会阻塞 main 函数中剩下语句的执行,而是直接忽略Go协程的返回并继续执行 main 函数剩下的语句。而在默认情况下,每个独立的Go应用运行时就创建了一个Go协程,其main函数就在这个Go协程中运行,这个 Go协程就被称为go 主协程(main Goroutine,下面简称主协程)。当我们在主协程中创建一个新的 Go 协程时,就会存在两个 Go 协程同时运行。正如同以前的程序那样,协程们会进行协同调度。因此,当主协程运行的时候,Go 调度器在主协程执行完之前并不会将控制权移交给其他协程。但是,一旦主协程执行完毕,整个程序会立即终止,调度器再也没有时间留给其他协程去运行了。所以,若没有进行阻塞,我们创建的协程可能会出现无法执行完成的情况。

CSP(Communicating Sequential Processes)

在Go语言中提倡通过通信共享内存而不是通过共享内存来实现通信。因此需要通过建立**通道(Channel)**来实现。通道分为无缓冲和有缓冲两种,使用make(chan 元素类型,[缓冲大小])来创建通道。

同步实现

  • Lock

通过互斥量和锁控制对互斥区的访问,使用lock.Lock()实现上锁,使用lock.Unlock()实现解锁。

  • WaitGroup

WaitGroup有三个暴露出来的方法分别是:Add();Done();Wait()

其内部的原理是一个计数器,记录现有的协程数量,在协程开启或结束时改变记录的数量,在有协程执行时阻塞主协程,等到数量为零则表明其他协程执行完成,继续执行后续程序。