这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
并发
多线程程序在单核cpu上执行
并行
多线程程序在多核cup上执行
Go可以充分发挥多核优势,高效运行
协程和线程
- 协程:用户态,轻量级线程,栈KB级别
- 线程:内核态,线程跑多个协程,栈MB级别
协程 vs 线程
- 调度方式 协程由编程者控制,协程之间可以有优先级;线程由系统控制,一般没有优先级,但Java中可以设置线程优先级
- 调度速度 协程几乎比线程快一个数量级。协程调用由编码者控制,可以减少无效的调度
- 资源占用 协程可以控制内存占用量,灵活性更好;线程由系统控制
- 创建数量 协程的使用更灵活(有优先级控制、资源使用可控),调度速度更快,相比于线程而言调度损耗更小,所以真实可创建且有效的协程数量可以比线程多很多,这是使用协程实现异步编程的重要基础。同样因为调度与资源的限制,有效协程的数量也是有上限的
通信
通过通信来共享内存而不是通过共享内存来通信,类似先进先出来保证收发顺序,但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