协程到底是什么?把它当成“一个能中途暂停的函数”,一切就通了
TL;DR:协程不是“更快的线程”,它是一个可以在中途停下来、把线程让给别人、之后还能从停下的那一行接着跑的函数。它省掉的不是计算时间,而是等 IO 时的空转。 面试被问“协程是什么”,大多数人的答案是背来的一句:“协程是用户态的轻量级线程。” 这句话不算错,但它几乎解释不了任何事。听完你还是不知道该在什么时候用它、为什么它会被一个 time.sleep() 卡死、为什么它不需要锁。 这篇不讲定义,只讲三件事: 协程在切什么、调度权在谁手里、什么时候不该用它。 一、先问一个更朴素的问题:谁在决定现在跑哪段代码? 进程、线程、协程经常被并列着讲,但它们回答的其实是同一个问题: “现在这一刻,CPU 该执行哪段代码,由谁说了算?” 谁在调度 切换成本 需要锁吗 能并行吗 进程 操作系统 最贵(换地址空间、页表) 需要(或靠 IPC) 能,真并行 线程 操作系统…
We haven't written up this one. Dev.to has the full story — the link below goes straight to it.