GO语言进阶与依赖管理 | 青训营笔记

72 阅读3分钟

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

一:本堂课的重点内容

image.png

二:详细知识点如下

01.并发

1、并发vs并行

image.png

  并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。

  并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。

并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。
在很多情况下,并发的效果比并行好,因为操作系统和硬件的总资源一般很少,但能支持系统同时做很多事情。这种“使用较少的资源做更多的事情”的哲学,也是指导 Go语言设计的哲学。

2、Goroutine协程vs线程

image.png

线程:是指进程内的一个执行单元,也是进程内的可调度实体,栈MB级别。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制,栈KB级别。从技术的角度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

image.png (并行)

3、csp

go提倡通过通信共享内存而不是通过共享内存而实现内存。

image.png

4、Channel

1)Channel是Go中的一个核心类型,可以把它看成一个管道.
通过它并发核心单元就可以发送或者接收数据进行通讯(communication).
它的操作符是箭头  **<-** (箭头的指向就是数据的流向)
2)就像 mapslice 数据类型一样, channel必须先创建再使用

image.png

3)实例    

image.png

5、并发安全Lock

image.png

都用了sleep实现暴力阻塞,由于不知道协程确切的执行时间,故无法设置一个精确的sleep时间。

6、WaitGroup:实现并发任务的同步

image.png image.png

02.依赖

1、背景

image.png

2、go依赖管理演进

image.png

1)GOPATH

image.png

弊端:无法实现package的多版本控制。

2)GO VENDER

image.png 弊端 image.png

3、go module实践

image.png

1)终极目标:定义版本规则和管理项目依赖关系。
2)依赖管理三要素

配置文件,描述依赖 go.mod

中心仓库管理依赖库 Proxy

本地工具 go get/mod

3)工具

image.png

三、课后个人总结

使用govendor管理项目并进行项目协作时,每次不需要提交整个vendor目录,只需要提交json文件。vendor 目录解决了工程依赖打包的问题,可将依赖与工程一起打包,减少下载依赖的时间。同一个项目只创建一个govendor目录,且在代码库的一级目录。

四、引用参考

www.runoob.com/w3cnote/go-… blog.csdn.net/weixin_4231…