并发模型-协程模型
一、介绍
1.1 什么是线程
协程(Coroutine)是一种:
运行在用户态、由程序自身调度的轻量级执行单元。
它不像线程那样由操作系统调度,而是由运行时(Runtime)负责调度。
例如:
操作系统
│
▼
Worker(线程)
│
┌──┼───────────────┐
│ │ │
▼ ▼ ▼
协程1 协程2 协程10000
可以看到:
- 一个线程
- 可以运行成千上万个协程
1.2 为什么会出现协程
先看传统线程。 例如:
线程1
↓
查询 MySQL
↓
等待200ms
等待期间:
CPU:
空闲
线程:
阻塞
CPU 没有工作。
协程出现以后:
协程1
↓
等待 MySQL
↓
主动让出 CPU
↓
协程2 开始执行
↓
协程3 开始执行
CPU 一直在处理其它任务。
因此:
协程解决的是 IO 等待导致 CPU 空闲的问题。
1.3 协程不是线程
协程永远依附于线程。
没有线程:
协程无法运行。
二、原理
2.1 协程为什么快
假设:
1000 个 HTTP 请求。
每个请求: 查询 MySQL 200ms
真正执行 SQL:5ms
剩余:195ms 都在等待
传统线程:
线程->阻塞195ms
CPU:空闲
协程:
协程A
↓
等待 MySQL
↓
挂起
↓
协程B
↓
等待 Redis
↓
挂起
↓
协程C
↓
HTTP 请求
↓
挂起
↓
协程D……
CPU 始终保持工作。
2.2 协程调度
线程:OS 调度
协程:Runtime 调度
负责:
- 挂起
- 恢复
- 切换
全部发生在:用户态
不用进入内核。
因此:切换速度远快于线程