这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
01 Go高性能本质
并发vs并行(广义并发的一种)
Goroutine协程
线程vs协程
go 创建协程
.Sleep 阻塞,保证子协程完成之前主线程不退出
CSP
左图能保证先入先出
右图通过互斥量对内存实现加速,需要获取临界区的权限,不同的协程之间容易发生数据冲突的问题,在一定程度上会影响性能。
Channel通道,引用类型
根据缓存大小分 无缓冲(同步通道)、有缓冲
AB 子协程 M 主协程
src 无缓冲队列,通过src 形成A到B协程通信
dest 有缓冲通道
通道 能保证顺序性/并发安全
defer 做延迟资源关闭
无缓冲/有缓冲 解决生产/消费效率不均衡问题(消费流程复杂/慢,要避免影响生产速率)
Sync同步/互斥锁
并发安全Lock (多个goroutine共享内存)
addWithLock 控制临界区的实现
lock: sync.Mutex互斥量关键字(java中的synchronized),通过lock获取临界区资源,计算完再把资源释放
addWithoutLock 没有对临界区进行一个保护(并发安全问题 underfined)
WaitGroup(实现并发任务的同步,.Sleep()等待协程结束但协程结束时间不确定)(sync包)
内部维护一个计数器,启动多个并发任务+n,每个任务完成-1,任务完成计数器为0