线程:操作系统内核管理;协程:用户态、程序自己管理,不需要内核参与。

1. 基本概念

线程(Thread)

  • 由操作系统内核调度,CPU 时间片由 OS 分配。

  • 属于操作系统层面,一个进程可以开多个线程。

  • 切换:内核态切换,切换开销较大,要保存寄存器、页表等。

  • 多线程:可以利用多核 CPU,实现真正并行。

  • Python 中threading模块就是线程;受 GIL 限制,CPU 密集任务无法多核并行,IO 密集可以并发。

协程(Coroutine)

  • 用户空间调度,操作系统完全不知道协程存在。

  • 在一个线程内部实现多个任务切换,又叫 “微线程”。

  • 切换:用户态切换,开销极小,只保存少量上下文。

  • 同一个线程里的协程,不能利用多核,只是并发。

  • Python:async/awaitasyncio就是协程。

适合协程

大量 IO 密集任务:大量网络请求、爬虫、接口调用,成千上万个任务,协程性能碾压线程。 高并发网络服务,web 后端异步接口。

例子:同时发 1000 次 http 请求 开 1000 个线程:开销大,容易报错。 协程:单线程跑 1000 个协程,开销极低。

适合线程

  1. CPU 密集计算:可以开多线程(注意 PythonGIL,CPU 密集更推荐多进程)

  2. 老的阻塞 IO 库(没有 async 版本),比如传统网络请求、文件读写

线程示例

import threading
import time

def task(name):
time.sleep(1) # 阻塞,操作系统切换线程
print(f"{name} done")

t1 = threading.Thread(target=task, args=("t1",))
t2 = threading.Thread(target=task, args=("t2",))
t1.start()
t2.start()
t1.join()
t2.join()

协程示例

import asyncio

async def task(name):
await asyncio.sleep(1) # 主动让出,不阻塞线程
print(f"{name} done")

async def main():
t1 = task("c1")
t2 = task("c2")
await asyncio.gather(t1, t2)

asyncio.run(main())

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐