Go进阶--工程实践 | 青训营笔记

54 阅读2分钟

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

从并发编程的角度探究Go高性能的原因

并发一般指多线程程序利用时间切片在一个核的CPU上运行。

image.png

而并行则指多线程程序在多个核对的CPU上运行。

image.png

Go则是充分发挥了多核优势,高效运行。

Goroutine

很多语言有多线程的技术,线程属于内核态,跑多个协程,栈一般是MB级别。 而Go使用了比线程更小的协程,又称微线程,属于用户态,是一种轻量级的线程,栈只需要KB级别。因此,一个应用甚至可以同时跑几万个协程。

CSP(并发模型)

image.png

Go圣经提倡“DO NOT COMMUNICATE BY SHARING MEMORY; INSTEAD, SHARE MEMORY BY COMMUNICATING.”

“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”

Channel

使用make建立通道,通道类似一种管道,用于线程间的通信。

make(chan 元素类型,[缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int,2)

image.png 使用无缓冲通道通信时,它会使两个goroutine同步化,因此,无缓冲通道也被称为同步通道。

解决这个同步问题的方式就是使用带有缓冲区的有缓冲通道。

make(chan int,2)这个2就是两个格子。格子上的包裹满了就会堵塞这个通道,直到有人取走一个包裹才能继续放进去。这也是一个典型的生产消费模型。

并发安全Lock

WaitGroup

依赖管理

要学会站在巨人的肩膀上,不用从0到1搭建项目。 Go依赖管理经历了三个阶段:

GOPATH->Go Vendor->Go Module

不同的Go版本依赖管理方式是不同的。

依赖管理三要素

  1. 配置文件,描述依赖 go.mod
  2. 重心仓库管理依赖库 Proxy
  3. 本地工具 go get/mod

测试

项目需要测试,因为上线后发生事故会产生严重的后果,最直接的原因就是损失大量资金。测试是避免事故的最后一道屏障。 测试分为:

  • 回归测试
  • 集成测试
  • 单元测试(Mock测试,基准测试……)

由上到下,覆盖率逐层变大,成本逐层降低。