这是我参与「第五届青训营」伴学笔记创作活动的第2天
前言
参与第五届青训营的第2天,今天学习了Goland的并发以及依赖管理,为了不让自己忘记了学习的内容,将今天学的内容整理成笔记以待以后复习
并发与并行
并发:多线程程序在一个核的CPU上运行
并行:多线程程序在多个核的CPU上运行
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生
并行是物理上的同时发生
用户态和内核态
根据操作系统对权限进行分级,可以将权限分为用户态和内核态
用户态相较于内核态有较低的执行权限,很多操作是不被操作系统允许的
线程和协程
线程:用户态:轻量级线程,栈KB级别
协程:内核态:线程可以运行多个协程,栈MB级别
CSP
建议通过通信共享内存而不是通过共享内存来实现线程间的通信
channel
无缓冲通道:会让线程间同步通信
有缓冲通道:线程间能够实现异步通信
并发安全锁Lock
在执行并发操作时如果不对资源进行加锁.虽然能够提高程序的运行速度,但是却不能够保证程序的运行结果的正确 WaitGroup包下有Add(delta int),Done(),Wait()方法,分别的功能为 Add(delta int):对某个资源的计数器+delta个数量 Done():计数器减1 Wait():阻塞进程直到计数器为0
func ManyGowait(){
var wg sync.WaitDone
wq.Add(5)//表示分配了5个
for i := 0;i<5;i++{
go func(j int){//开启并发执行
defer wg.Done()//计数器减1
//do...
}(i)
}
wg.Wait()//当计数器为0时执行
}
以上程序的运行结果为执行并发do里的操作