这是我参与「第五届青训营」伴学笔记创作活动的第2天
并发编程
-
并发和并行
并发:多线程程序在一个核的CPU上运行
并行:多线程程序在多个核的CPU上运行
-
协程和线程
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程,栈MB级别
go语言通过协程实现高并发
-
通道——通过通信共享内存
//make(chan 元素类型,缓冲大小) make(chan int,0) //无缓冲通道,同步通道 make(chan int,2) //有缓冲通道 -
并发Lock——通过内存共享通信
WaitGroup 同步协程状态,相当于三个方法:
Add()加一、Wait()减一、Done()阻塞至计数器为0
依赖管理
演进Go Path-->Go Vendor-->Go Module
-
Go Path
所有的项目代码依赖src下的代码,可使用go get下载最新版本的包到src目录下。
弊端:无法实现package的多版本控制。
-
Go Vendor
项目目录下增加Vendor的文件夹,所有依赖包以副本形式放在该文件夹。
项目的依赖优先从vendor目录下获取,然后再去go path目录下去寻找。
解决了多项目需要同一个package的依赖冲突问题。
弊端:无法控制依赖的版本,更新项目有可能出现依赖冲突,导致编译出错。
-
Go Module
解决以上弊端,通过go.mod文件管理依赖包版本,使用命令go mod/go get
依赖管理三要素:
1、配置文件,描述依赖,go.mod文件
go mod文件由三部分组成,依赖管理单元,原生sdk版本,单元依赖,每个依赖单元用模块路径+版本来唯一标识。
1.1版本规则:
语义化版本,三部分组成:
major大版本,不同版本可以不兼容; minor新增函数,需要在一个major下兼容; patch代码bug的xiufu; 例如V1.3.0 V2.3.0;基于commit伪版本,三部分组成:
版本前缀,与语义化版本一样; 时间戳; 12位哈希码1.2依赖关系:
直接依赖
indirec标识间接依赖
incompatible标识没有go.mod文件并且主版本2+的依赖
依赖有多版本时选择最低的兼容版本
2、中心仓库管理依赖库,proxy
依赖分发,即依赖如何下载。常见的GitHub,但无法保证依赖的可用性。
使用proxy可以保证依赖的稳定性,它会缓存代码。
3、本地工具,go get/mod
go get命令 拉取指定依赖 @update 默认,最新版本 @none 删除依赖 @v1.1.1 语义版本 @67vbsf 特定的commit @master 分支的最新commit go mod命令 操作 init 初始化,创建go.mod文件 download 下载模块到本地缓存 tidy 增加需要的依赖,删除不需要的依赖,常用指令
总结
了解了go语言的协程、通道、lock等概念和基本使用方法,以及Go依赖管理演进的历程和能够使用常见的go mod 命令。