快速了解python协程与线程
线程:操作系统内核管理;协程:用户态、程序自己管理,不需要内核参与。
1. 基本概念
线程(Thread)
-
由操作系统内核调度,CPU 时间片由 OS 分配。
-
属于操作系统层面,一个进程可以开多个线程。
-
切换:内核态切换,切换开销较大,要保存寄存器、页表等。
-
多线程:可以利用多核 CPU,实现真正并行。
-
Python 中
threading模块就是线程;受 GIL 限制,CPU 密集任务无法多核并行,IO 密集可以并发。
协程(Coroutine)
-
用户空间调度,操作系统完全不知道协程存在。
-
在一个线程内部实现多个任务切换,又叫 “微线程”。
-
切换:用户态切换,开销极小,只保存少量上下文。
-
同一个线程里的协程,不能利用多核,只是并发。
-
Python:
async/await、asyncio就是协程。
适合协程
大量 IO 密集任务:大量网络请求、爬虫、接口调用,成千上万个任务,协程性能碾压线程。 高并发网络服务,web 后端异步接口。
例子:同时发 1000 次 http 请求 开 1000 个线程:开销大,容易报错。 协程:单线程跑 1000 个协程,开销极低。
适合线程
-
CPU 密集计算:可以开多线程(注意 PythonGIL,CPU 密集更推荐多进程)
-
老的阻塞 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())
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)