这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记
相关链接
- ppt:bytedance.feishu.cn/file/boxcnR…
- homework:
juejin.cn/post/709372…
并发和并行
- 一个核并发
- 多个核并行
goroutine
- 线程:内核态、轻量级线程、栈Mb级别
- 协程:用户态、线程跑多个协程、栈KB级别,轻松开启成千上万个协程 go语言提倡通过通信共享内存,而不是通过共享内存而实现通信
channel
make(chan 类型,缓冲大小)
- 有缓冲通道:同步,发送接收要同时准备好才能操作
- 无缓冲通道:异步,只要缓冲没满,就可以一直操作,不需要同时准备好
并发安全
lock sync.Mutex锁 多个协程并发执行一个操作,为了安全需要对该操作互斥执行,但这会损失性能
WaitGroup
- Add() 计数器加+delta
- Done() 计数器-1
- Wait() 阻塞直到计数器为0
func hello(i int) {
println("hello world : " + fmt.Sprint(i))
}
func ManyGo() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
这样就不用再主程序中sleep,因为当计数器为0时,停止阻塞。保证了主程序退出前,协程都跑完
依赖管理
- GOPATH:
- bin二进制文件
- pkg项目编译的中间产物,加速编译
- src项目源码:项目代码直接依赖src下的代码,go get下载最新版本的包到src目录下 弊端: 无法实现package多版本控制:例如
A和B依赖某一package的不同版本
- Go Vendor 解决了多个项目需要同一个package依赖冲突的问题
但无法控制依赖的版本
- Go Module 定义版本规则和管理项目依赖关系