Go语言并发知识 | 青训营笔记

150 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。

1.一些并发相关概念

Goroutine协程:

协程:用户态,轻量级线程,栈MB级别

线程:内核态,线程跑多个协程,栈KB级别

使用go func(){}()匿名函数即可启用协程

通过通信共享内存,channel:

make(chan type, cap),分为有缓冲与无缓冲通道

无缓冲通道,即cap为0,要求发送方和接收方的goroutine同时准备好,才能完成发送和接收操作,如果有一个还没准备好,会导致另一个goroutine被阻塞。

有缓冲通道,cap不为0,可以缓解生成消费的压力。

并发安全,Lock,WaitGroup:

使用lock sync.Mutex,调用lock.Lock()和lock.Unlock()保护共享资源

waitgroup计数器开启协程+1,执行结束-1,主线程阻塞直到计数器为0

使用wg sync.WaitGroup,调用wg.Add()添加计数,调用wg.Done()使其-1,调用wg.Wait()进行阻塞

2.依赖管理

框架,日志等可以使用sdk,如何管理sdk?

gopath:bin, pkg, src

依赖的代码放在src文件夹下,但存在依赖版本不一致的问题

govender:存放当前项目的一个依赖副本,解决了多个项目依赖冲突的问题

但存在依赖的几个sdk所依赖的sdk存在冲突

go module:通过go.mod文件管理依赖包版本,go mod指令添加依赖

go.mod描述配置文件

proxy作为中心仓库管理依赖库

本地工具 go get/mod

go.mod中, //indirect表示非直接依赖  //+incompatible表示可能存在不兼容

proxy会缓存所有依赖的所有版本,实现稳定依赖

go mod init 初始化,创建go.mod

go mod download,下载sdk到本地

go mod tidy,清除不需要依赖,添加需要依赖

3.测试

单元测试,mock测试,基准测试

单元测试:

所有文件都以.go结尾 ,函数命名func TestXxx(*testing.T), 使用m.Run()启用包下所有测试函数

Mock测试:

对于某些不容易构造或者不容易获取的比较复杂的对象,用一个虚拟的对象(Mock 对象)来创建以便测试的测试方法

基准测试:

测试代码性能分析