Go 语言上手 - 工程实践 - 并发依赖 | 青训营笔记

206 阅读1分钟

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

相关链接

  1. ppt:bytedance.feishu.cn/file/boxcnR…
  2. homework:juejin.cn/post/709372…

并发和并行

image.png

  • 一个核并发
  • 多个核并行

goroutine

  • 线程:内核态、轻量级线程、栈Mb级别
  • 协程:用户态、线程跑多个协程、栈KB级别,轻松开启成千上万个协程 go语言提倡通过通信共享内存,而不是通过共享内存而实现通信

channel

make(chan 类型,缓冲大小)

  1. 有缓冲通道:同步,发送接收要同时准备好才能操作
  2. 无缓冲通道:异步,只要缓冲没满,就可以一直操作,不需要同时准备好

并发安全

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:
  1. bin二进制文件
  2. pkg项目编译的中间产物,加速编译
  3. src项目源码:项目代码直接依赖src下的代码,go get下载最新版本的包到src目录下 弊端: 无法实现package多版本控制:例如

A和B依赖某一package的不同版本

  • Go Vendor 解决了多个项目需要同一个package依赖冲突的问题

但无法控制依赖的版本

  • Go Module 定义版本规则和管理项目依赖关系