并发与并行 | 青训营笔记

84 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

并发

多线程程序在单核cpu上执行

并行

多线程程序在多核cup上执行

Go可以充分发挥多核优势,高效运行

协程和线程

  • 协程:用户态,轻量级线程,栈KB级别
  • 线程:内核态,线程跑多个协程,栈MB级别

协程 vs 线程

  1. 调度方式 协程由编程者控制,协程之间可以有优先级;线程由系统控制,一般没有优先级,但Java中可以设置线程优先级
  2. 调度速度 协程几乎比线程快一个数量级。协程调用由编码者控制,可以减少无效的调度
  3. 资源占用 协程可以控制内存占用量,灵活性更好;线程由系统控制
  4. 创建数量 协程的使用更灵活(有优先级控制、资源使用可控),调度速度更快,相比于线程而言调度损耗更小,所以真实可创建且有效的协程数量可以比线程多很多,这是使用协程实现异步编程的重要基础。同样因为调度与资源的限制,有效协程的数量也是有上限的

通信

通过通信来共享内存而不是通过共享内存来通信,类似先进先出来保证收发顺序,但go语言还保留着通过共享内存来通信的方式。

Channel

make(chan 元素类型,[缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int,2)

典型的生产消费者问题

并发安全

sycn.Mutex,与Java的lock锁类似

WaitGroup

计数器:开启协程+1,执行结束-1,主协程阻塞道计数器为0

Add(delta int)计算器delta

Done()计数器-1

Wait()阻塞直到计数器为0