这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
从并发编程的角度探究Go高性能的原因
并发一般指多线程程序利用时间切片在一个核的CPU上运行。
而并行则指多线程程序在多个核对的CPU上运行。
Go则是充分发挥了多核优势,高效运行。
Goroutine
很多语言有多线程的技术,线程属于内核态,跑多个协程,栈一般是MB级别。 而Go使用了比线程更小的协程,又称微线程,属于用户态,是一种轻量级的线程,栈只需要KB级别。因此,一个应用甚至可以同时跑几万个协程。
CSP(并发模型)
Go圣经提倡“DO NOT COMMUNICATE BY SHARING MEMORY; INSTEAD, SHARE MEMORY BY COMMUNICATING.”
“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”
Channel
使用make建立通道,通道类似一种管道,用于线程间的通信。
make(chan 元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
使用无缓冲通道通信时,它会使两个goroutine同步化,因此,无缓冲通道也被称为同步通道。
解决这个同步问题的方式就是使用带有缓冲区的有缓冲通道。
make(chan int,2)这个2就是两个格子。格子上的包裹满了就会堵塞这个通道,直到有人取走一个包裹才能继续放进去。这也是一个典型的生产消费模型。
并发安全Lock
WaitGroup
依赖管理
要学会站在巨人的肩膀上,不用从0到1搭建项目。 Go依赖管理经历了三个阶段:
GOPATH->Go Vendor->Go Module
不同的Go版本依赖管理方式是不同的。
依赖管理三要素
- 配置文件,描述依赖 go.mod
- 重心仓库管理依赖库 Proxy
- 本地工具 go get/mod
测试
项目需要测试,因为上线后发生事故会产生严重的后果,最直接的原因就是损失大量资金。测试是避免事故的最后一道屏障。 测试分为:
- 回归测试
- 集成测试
- 单元测试(Mock测试,基准测试……)
由上到下,覆盖率逐层变大,成本逐层降低。