并发

并发

进程、线程、协程

  • 进程:

    1. 进程是什么? 一种系统运行行动
    2. 进程的定位是什么? 程序的执行实体
    3. 进程长什么样子? 在terminal中查看
    4. 进程怎么使用? [一般情况]一个程序一个进程, [多进程]一个程序多个进程
  • 线程:

    1. 线程是什么? 运算调度的最小单元
    2. 线程的作用是什么? 同时运算多个任务
    3. 和进程有什么区别? 大哥和小弟的关系
    4. 线程内存大小?
      怎么"切”? 内核控制
      “切多大”? 缓存+内核控制
      “等长吗”? 不等长
    5. 线程观摩
      1. 回到我们的terminal
      2. 输入命令ps -M [pid]
      3. 查看对应pid的线程
  • 协程

    1. 协程(Coroutine)是什么? 轻量级的线程
    2. 协程的定位是什么? 用户控制的函数
    3. 有什么样的优势?
    4. 协程优势
      1. 协程的内存消耗更小
        1. 一个线程可以包含多个协程
        2. 线程大约8MB的内存申请量
        3. 协程大概2kb的内存申请量
      2. 上下文切换更快
        1. 协程少一道手续
        2. 线程申请内存, 需要走过内核
        3. 协程申请内存,不需要走过内核
  • 灵魂Goroutine

    1. Goroutine是什么? 一种协程(Coroutine)
    2. Goroutine和协程有怎样的关系? 一种优化
    3. 为什么使用Goroutine?
      1. 去掉了冗余的协程声明周期管理
        1. 协程创建
        2. 协程完成
        3. 协程重用
      2. 降低额外的延迟和开销
        1. 由于协程简频繁交互导致的
      3. 降低加锁/解锁的频率 a. 降低一部分额外的开销
    4. Goroutine如何使用

多协程的核心机理

什么是多协程?

  1. 官方定义: 一段时间内协程的并行
  2. 实际应用: 某个任务使用多个协程同时进行处理

多协程的相对性

  1. 同时处理非同一道菜的食材 不算多协程
  2. 同时处理同一道菜的食材 算多协程
  3. 同时处理同一道菜的同一种食材 算多协程

多协程的使用场景

  1. 运算比较多的流程上
  2. 协程间依赖性比较弱

channel阻塞

阻塞条件:
输入channel的数据量不等于channel能接受的量

channel阻塞的严重后果

程序位置: 非主流程 channel下游获取不到结果, 造成数据丢失

程序位置: 主流课 主流程卡带,整个程序沉睡,股中昂级别P0级别

channel解决办法

设定channel缓冲:
make(chan int, 10) 10=channel的大小,即可以放多少个元素 channel的大小如何设定: 一般根据业务场景需求来

如何利用channel阻塞

实现资源争抢
实现多协程锁, 变相的"锁”
实现消息定额消费