这是我参与「第五届青训营」笔记创作活动的第三天。
一:本堂课的重点内容
二:详细知识点如下
01.并发
1、并发vs并行
并发(concurrency):把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行(parallelism):把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。
在很多情况下,并发的效果比并行好,因为操作系统和硬件的总资源一般很少,但能支持系统同时做很多事情。这种“使用较少的资源做更多的事情”的哲学,也是指导 Go语言设计的哲学。
2、Goroutine协程vs线程
线程:是指进程内的一个执行单元,也是进程内的可调度实体,栈MB级别。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
协程:是一种用户态的轻量级线程,协程的调度完全由用户控制,栈KB级别。从技术的角度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
(并行)
3、csp
go提倡通过通信共享内存而不是通过共享内存而实现内存。
4、Channel
1)Channel是Go中的一个核心类型,可以把它看成一个管道.
通过它并发核心单元就可以发送或者接收数据进行通讯(communication).
它的操作符是箭头 **<-** (箭头的指向就是数据的流向)
2)就像 map 和 slice 数据类型一样, channel必须先创建再使用
3)实例
5、并发安全Lock
都用了sleep实现暴力阻塞,由于不知道协程确切的执行时间,故无法设置一个精确的sleep时间。
6、WaitGroup:实现并发任务的同步
02.依赖
1、背景
2、go依赖管理演进
1)GOPATH
弊端:无法实现package的多版本控制。
2)GO VENDER
弊端
3、go module实践
1)终极目标:定义版本规则和管理项目依赖关系。
2)依赖管理三要素
配置文件,描述依赖 go.mod
中心仓库管理依赖库 Proxy
本地工具 go get/mod
3)工具
三、课后个人总结
使用govendor管理项目并进行项目协作时,每次不需要提交整个vendor目录,只需要提交json文件。vendor 目录解决了工程依赖打包的问题,可将依赖与工程一起打包,减少下载依赖的时间。同一个项目只创建一个govendor目录,且在代码库的一级目录。