GO高性能的本质 | 青训营笔记

49 阅读1分钟

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

01 Go高性能本质

并发vs并行(广义并发的一种)

image-20230215210508003.png

Goroutine协程

线程vs协程

image-20230216100313301.png

image-20230215211022923.png

go 创建协程

.Sleep 阻塞,保证子协程完成之前主线程不退出

CSP

image-20230215211247777.png

左图能保证先入先出

右图通过互斥量对内存实现加速,需要获取临界区的权限,不同的协程之间容易发生数据冲突的问题,在一定程度上会影响性能。

Channel通道,引用类型

根据缓存大小分 无缓冲(同步通道)、有缓冲

image-20230215212822615.png

AB 子协程 M 主协程

src 无缓冲队列,通过src 形成A到B协程通信

dest 有缓冲通道

通道 能保证顺序性/并发安全

defer 做延迟资源关闭

无缓冲/有缓冲 解决生产/消费效率不均衡问题(消费流程复杂/慢,要避免影响生产速率)

Sync同步/互斥锁

并发安全Lock (多个goroutine共享内存)

image-20230216101432952.png

addWithLock 控制临界区的实现

lock: sync.Mutex互斥量关键字(java中的synchronized),通过lock获取临界区资源,计算完再把资源释放

addWithoutLock 没有对临界区进行一个保护(并发安全问题 underfined)

WaitGroup(实现并发任务的同步,.Sleep()等待协程结束但协程结束时间不确定)(sync包)

内部维护一个计数器,启动多个并发任务+n,每个任务完成-1,任务完成计数器为0

image-20230216102943802.png

image-20230216103110333.png