并发编程和依赖管理 | 青训营笔记

64 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第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版本,单元依赖,每个依赖单元用模块路径+版本来唯一标识。

    1673963084098.png

    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 命令。