并发与并行
- 并发:多线程程序在一个核的cpu上运行
- 并行:多线程程序在多个核的cpu上运行
进程,协程与线程
- 进程: 进程是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
- 线程: 线程从属于进程,是程序的实际执行者,一个进程至少包含一个主线程,也可以有更多的子线程,线程拥有自己的栈空间。
对操作系统而言,线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线程,都是由操作系统所管理的。 — 协程: 协程是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。
Goroutine
在Go语言中,goroutine是实现并发的主要方式。goroutine是由Go运行时环境管理的轻量级线程。
当你在函数调用前加上go关键字,那么这个函数就会在一个新的goroutine中并发执行。这样,函数会立即返回,而函数和调用者可以并发执行。
CSP
是Golang的并发模型。通过通信共享内存
channel 共享内存
通道
Channel是 Golang 在语言级别上提供的 goroutine 间的通讯方式,可以使用channel在多个 goroutine 之间传递消息。如果说 goroutine 是 Go 程序并发的执行体,channel 就是它们之间的连接。channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。
- 创建通道的方法
- 无缓冲通道
make(chan int) - 有缓冲通道
make(chan int,2)
- 无缓冲通道
- 向通道发送接收数据都用<-
ch1 := make(chan int,2)
ch1 <- 10 //将10放入通道
ch1 <- 20
data := <- ch1. //接收数据
如果接收方一直没有接收通道中的数据,发送将受到阻塞
- 关闭通道
close(ch)
Sync 解决协程间同步问题
- 同步:在进程中任务未结束时需等待结束才能执行下一个任务
- 异步:在进程中任务未结束但在等待的过程中可先去执行下一个任务
- 并发安全lock:不加锁可能产生预期外的数值
- WaitGroup函数 计数器:开启协程+1;执行结束-1;主协程阻塞知道计数器为0
依赖管理
GOPATH
- 环境变量$PATH
- 工作区:
- bin:项目编译的二进制文件
- pkg:项目编译的中间产物,加速编译
- src:项目源码
- 项目代码直接依赖src下的代码
- go get直接下载最新版本的包到src目录下
- 弊端:无法实现package多版本的控制
Go Vendor
- 项目目录下增加vendor文件,所有依赖包副本放在vendor
- 弊端:依赖冲突
Go Module
- 通过
go.mod文件管理依赖包版本 - 通过
go get/go mod指令工具管理依赖包
依赖管理三要素
- 配置文件,描述依赖:go.mod
- 依赖管理:选择最低的兼容版本
- 中心仓库管理依赖库: Proxy
- Proxy 缓存软件内容
- 变量GOPROXY:
GOPROXY="https://proxy1.cn,https://proxy2.cn,direct"服务点URL列表,direct表示源站
- 本地工具:go get/mod
- go mod
- init 初始化,创建go.mod文件
- download 下载模块到本地缓冲
- tidy 增加需要的依赖,删除不需要的依赖
- go mod