后端笔记02 Go并发编程 依赖包的管理| 青训营笔记

85 阅读3分钟

Go 语言进阶与依赖管理 - 掘金 (juejin.cn)
线程和协程的区别的通俗说明 - 知乎 (zhihu.com)
为什么使用通信来共享内存 - 面向信仰编程 (draveness.me) (358条消息) 不要通过共享内存来通信,要通过通信来共享内存

这是我参与「第五届青训营 」伴学笔记创作活动的第 2天

Go高性能的本质

并发和并行

image.png 可以参考我写的这篇文章:

CPU核心数线程数、程序进程线程、并发并行的简单理解

协程和线程

java中只有进程和线程,但是Go中多了一个协程

  • 协程:用户态,轻量级线程, 栈KB级别。
  • 线程:内核态,线程跑多个协程, 栈MB级别。
    简单来说:线程要进内核,协程不需要

image.png

协程的例子

image.png

使用通信来共享内存 而不是 通过共享内存来通信

可以参考下边的文章:

为什么使用通信来共享内存 - 面向信仰编程 (draveness.me)
共享内存原理及实现通信过程_共享内存通信_几亿少女的梦的博客

使用通信来共享内存
通信共享内存是指在多个进程之间共享一块内存,这块内存可以用来存储和传递信息,从而实现进程间的通信。本质上是通过文件来存储和传递信息

通过共享内存来通信
共享内存实现通信则是指在多个进程之间共享一个文件,这个文件可以用来存储和传递信息,从而实现进程间的通信。本质上是通过在内存中共享

比起通过文件共享信息,内存更快,所以Go比java快

Channel的例子

image.png image.png image.png

waitgroup

image.png

image.png

Go的依赖管理

依赖管理的作用

  • 工程项目不可能基于标准库0~1编码搭建
  • 管理依赖库很麻烦(用过Python的都知道)
  • 不同环境依赖版本不同,同一个项目在其他环境可能不能运行

Go的依赖管理的3个阶段

Go的依赖包管理主要分为3个阶段

  1. GOPATH
  2. Go Vender
  3. Go Module

GOPATH

GOPATH相对简单粗暴,直接下载最新的包,保存本地项目源码的目录下

image.png GOPATH的弊端 image.png

Go Vender

Go Vender给每个项目增加了一个依赖的副本,解决了多个项目需要同一个包的问题 image.png

Go Vender的弊端

  • 无法控制依赖的版本
  • 更新项目可能导致依赖出错 image.png

Go Module

  • 通过go.mod文件管理依赖包版本
  • 通过goget/gomod指令工具管理依赖包
  • 终极目标:定义版本规则和管理项目依赖关系

Go Module三要素

image.png

Go Module依赖配置

image.png

image.png

直接依赖和间接依赖

image.png

image.png

依赖图 Go会选择最低的兼容版本 image.png

Go Proxy

依赖分发-回源的问题

image.png

为了解决上述问题,Go使用了Proxy这个第三方服务站点来管理依赖。\

  • Proxy会缓存源站的内容
  • Proxy实现了稳定,可靠的依赖分发

image.png

Proxy的配置

项目从左往右依次寻找依赖,直到回到源站
类似于本地缓存——二级缓存——DB image.png

本地工具1 go get image.png

本地工具2 go mod image.png