并发模型-协程模型

一、介绍

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 调度

负责:

  • 挂起
  • 恢复
  • 切换

全部发生在:用户态

不用进入内核。

因此:切换速度远快于线程