1. Go语言进阶
-
并行与并发
- 并发:多线程程序在一个核的cpu运行(宏观上看是同时执行,微观上看是交替执行)
- 并行:多线程程序在多个核的cpu运行(有多个核,相当于有多个服务员,故可以同时进行)
- Go可以重复发挥多核优势
-
进程、线程、协程
- 进程
- 进程是程序一次动态执行的过程,是程序运行的基本单位。
- 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。
- 进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较大,但相对比较稳定安全。协程切换和协程切换
- 线程 MB
- 线程又叫做轻量级进程(内核态),是CPU调度的最小单位。
- 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。
- 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。
- 程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
- 协程 KB
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。
- 一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。
- 与其让操作系统调度,不如我自己来,这就是协程
- 开启协程:在调用函数前+
go - 协程间的通信:Go提倡通过通信共享内存而不是通过共享内存(同时操作一个内存,性能下降)而实现通信
图例:
原文链接:blog.csdn.net/qq_39304851…
- 进程
-
channel
- 如果说
goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。 - 创建格式:
make(chan 元素类型,[缓冲大小]) - 类型
- 无缓冲通道,又称同步通道(无缓冲通道进行通信将导致发送和接收的
goroutine同步化)make(chan int) - 有缓冲通道
make(chan int,2),可以解决生产者-消费者的速度不匹配问题
- 无缓冲通道,又称同步通道(无缓冲通道进行通信将导致发送和接收的
- 如果说
-
并发安全Lock
- 涉及到临界资源、临界区,类似在进入临界区之前检查变量是否为1
- 加锁确保内存不会被同时操作而导致的并发问题
- Go的加锁
-
WaitGroup
- sleep可以暴力阻塞
- 方法
- Add(delta int)计数器+delta
- Done()计数器-1
- Wait()阻塞直到计数器为0,即并发任务完成了
2. 依赖管理
- GOPATH
- 弊端:无法实现package的多版本控制
- Go Vendor
- 弊端:无法控制版本的依赖;更新项目又可能出现依赖冲突,导致编译出错
- Go Module
- 依赖配置三要素
- 配置文件,描述依赖go.mod
- 中心仓库管理依赖库Proxy
- 本地工具- go get / go mod
- 依赖配置三要素
3. 测试
- 单元测试
- 覆盖度,即已运行代码占总代码的比例。覆盖度越高越好,但一般都在50%~60%
- 依赖,要实现幂等&稳定 -> Mock
- Mock(有外部依赖时,保证单元测试的稳定性)
- monkey包:guthub.com/bouk/monkey
- 快速Mock函数
- 打桩:用一个函数/方法替换掉原来的
- 为一个函数/方法打桩
- 基准测试(分析性能指标时,通过本地测试比较方便)
小结
进阶课程的一些内容跟上学期学习的操作系统课程有些相似,通过多线程的学习也可以更好的理解“进程、线程”,今天才知道还有“协程”这东西。对进程、线程、协程大概的关系理解为:进程>线程>协程,通过上述的图例也能比较清晰的认知。
感觉自身的不足在:除了对语言格式、代码比较浅层的理解外,像依赖、测试(虽然前段时间也有为了找测试实习自学过,但是感觉跟老师不一样,一个偏向于工具,一个偏向于代码)、形成http服务器等就看着有点懵。
害,菜鸡的第二天!