Go进阶-并发、依赖管理与实践 | 青训营笔记

69 阅读2分钟

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

课程学习

今天学习了go语言的并发、依赖管理与测试,并进行了一个web单页面项目的实战。

Go的并发

进程

进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位;
为了实现 CPU 在多个进程之间切换,需要保存进程的上下文(如程序计数器、栈等等),以便下次切换回来可以恢复执行。还需要一种调度算法,Linux 中采用了基于时间片和优先级的完全公平调度算法。
进程的上下文切换涉及到从【用户态】->【内核态】->【用户态】的过程

线程和协程

进程拥有太多的资源,进程的创建、切换、销毁,都会占用很长的时间,CPU 虽然利用起来了,但如果进程过多,CPU 有很大的一部分都被用来进行进程调度了。

  • 线程:内核态,线程跑多个协程,是栈MB级别的。线程的出现就是为了减少上下文切换时的开销。
  • 协程:用户态,属于轻量级的线程,是栈KB级别的。协程是用户视角的一种抽象,操作系统并没有协程的概念。

Goroutine: 在go中,在函数前面加go就可以为其开启一段协程。

Channel

在go中,提倡使用channel来使用共享内存,定义一个channel:make(chan 元素类型, [缓冲大小])

  • 无缓冲channel: make(chan int)
  • 有缓冲channel:make(chan int, 2)
捕获.PNG

依赖管理

依赖管理的推演

GOPATH -> GO Vendor -> Go Module

  • 不同环境(项目)依赖的版本不同
  • 为了控制依赖库的版本

目前广泛应用的就是Go Module

GOPATH

  • 是一个环境变量,也就是go的一个工作区;
  • 项目代码直接依赖src下的代码;
  • go get下载最新版本的包到src目录下。

缺点:无法实现package的多版本控制。

Go Vendor

增加vendor文件存放所有依赖包的副本,每个项目引入一份依赖的副本。
缺点:无法控制依赖的版本;依赖冲突;

Go Module

go v1.11实践性引入,v1.16默认开启。

  • 通过go.mod文件管理依赖包版本;
  • 通过go get以及go mod指令工具管理依赖包。

依赖管理三要素:

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

测试

捕获.PNG

回归测试 -> 集成测试 -> 单元测试
覆盖率变大而成本降低。

项目实战

项目是比较简单的。

捕获.PNG