并发
进程、线程、协程
-
进程:
- 进程是什么? 一种系统运行行动
- 进程的定位是什么? 程序的执行实体
- 进程长什么样子? 在terminal中查看
- 进程怎么使用? [一般情况]一个程序一个进程, [多进程]一个程序多个进程
-
线程:
- 线程是什么? 运算调度的最小单元
- 线程的作用是什么? 同时运算多个任务
- 和进程有什么区别? 大哥和小弟的关系
- 线程内存大小?
怎么"切”? 内核控制
“切多大”? 缓存+内核控制
“等长吗”? 不等长 - 线程观摩
- 回到我们的terminal
- 输入命令ps -M [pid]
- 查看对应pid的线程
-
协程
- 协程(Coroutine)是什么? 轻量级的线程
- 协程的定位是什么? 用户控制的函数
- 有什么样的优势?
- 协程优势
- 协程的内存消耗更小
- 一个线程可以包含多个协程
- 线程大约8MB的内存申请量
- 协程大概2kb的内存申请量
- 上下文切换更快
- 协程少一道手续
- 线程申请内存, 需要走过内核
- 协程申请内存,不需要走过内核
- 协程的内存消耗更小
-
灵魂Goroutine
- Goroutine是什么? 一种协程(Coroutine)
- Goroutine和协程有怎样的关系? 一种优化
- 为什么使用Goroutine?
- 去掉了冗余的协程声明周期管理
- 协程创建
- 协程完成
- 协程重用
- 降低额外的延迟和开销
- 由于协程简频繁交互导致的
- 降低加锁/解锁的频率 a. 降低一部分额外的开销
- 去掉了冗余的协程声明周期管理
- Goroutine如何使用
多协程的核心机理
什么是多协程?
- 官方定义: 一段时间内协程的并行
- 实际应用: 某个任务使用多个协程同时进行处理
多协程的相对性
- 同时处理非同一道菜的食材 不算多协程
- 同时处理同一道菜的食材 算多协程
- 同时处理同一道菜的同一种食材 算多协程
多协程的使用场景
- 运算比较多的流程上
- 协程间依赖性比较弱
channel阻塞
阻塞条件:
输入channel的数据量不等于channel能接受的量
channel阻塞的严重后果
程序位置: 非主流程 channel下游获取不到结果, 造成数据丢失
程序位置: 主流课 主流程卡带,整个程序沉睡,股中昂级别P0级别
channel解决办法
设定channel缓冲:
make(chan int, 10) 10=channel的大小,即可以放多少个元素
channel的大小如何设定: 一般根据业务场景需求来
如何利用channel阻塞
实现资源争抢
实现多协程锁, 变相的"锁”
实现消息定额消费