GO语言并发 | 青训营笔记

40 阅读2分钟

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

前言

参与第五届青训营的第2天,今天学习了Goland的并发以及依赖管理,为了不让自己忘记了学习的内容,将今天学的内容整理成笔记以待以后复习

并发与并行

并发:多线程程序在一个核的CPU上运行
并行:多线程程序在多个核的CPU上运行
并发是指一个处理器同时处理多个任务。   
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。   
并发是逻辑上的同时发生
并行是物理上的同时发生

用户态和内核态

根据操作系统对权限进行分级,可以将权限分为用户态和内核态
用户态相较于内核态有较低的执行权限,很多操作是不被操作系统允许的

线程和协程

线程:用户态:轻量级线程,栈KB级别
协程:内核态:线程可以运行多个协程,栈MB级别

CSP

image.png 建议通过通信共享内存而不是通过共享内存来实现线程间的通信

channel

image.png 无缓冲通道:会让线程间同步通信 有缓冲通道:线程间能够实现异步通信

并发安全锁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里的操作