Python 协程
·
一、什么是协程?
一句话定义
协程 = 可以暂停 / 恢复的函数 + 单线程内实现并发
- 不需要多线程、多进程
- 由用户自己控制切换,不是操作系统切换
- 极轻量、无切换开销、高并发性能极强
通俗比喻
你在烧水:
- 同步:等着水开 → 啥也不干
- 多线程:再叫一个人盯着水
- 协程:水在烧,你去切菜 → 水快开了再回来
协程就是:一个人同时干多件事,遇到等待就切换!
二、协程的核心优势
- 极高并发:单线程可跑上万协程
- 极轻量:一个协程只需几 KB 内存
- 无锁竞争:单线程执行,不用加锁
- 切换极快:用户态切换,比线程快 100 倍
- 适合 I/O 密集型:网络请求、文件读写、数据库
三、Python 协程发展史(一句话)
- 生成器(yield)→ 实现基础协程
- asyncio + async/await → 现代协程(Python 3.7+)
现在只用学:async /await
四、协程核心关键字(必背)
- async:定义一个协程函数
- await:暂停当前协程,等待异步操作完成
- asyncio:Python 官方异步库,运行协程
五、最简单协程示例(入门必看)
import asyncio
# 1. 定义协程函数(async 声明)
async def hello():
print("开始")
# 2. await 暂停,等待异步睡眠
await asyncio.sleep(1)
print("结束")
# 3. 运行协程
asyncio.run(hello())
六、真正的并发(同时运行多个任务)
协程的威力在这里!
import asyncio
async def task(name, t):
print(f"任务 {name} 开始,等待 {t}s")
await asyncio.sleep(t) # 模拟 I/O 等待
print(f"任务 {name} 完成")
async def main():
# 创建 3 个并发任务
t1 = task("A", 1)
t2 = task("B", 2)
t3 = task("C", 3)
# 并发执行(总耗时 ≈ 3s,不是 1+2+3=6s!)
await asyncio.gather(t1, t2, t3)
asyncio.run(main())
结果
总耗时 3 秒,不是 6 秒!这就是协程并发。
七、协程运行原理(超级重要)
async定义的函数 不会直接运行,返回协程对象await时:- 暂停当前协程
- 去执行别的协程
- 等待结束后自动回来继续
- 由
asyncio事件循环统一调度
协程切换 = 函数暂停与恢复,没有线程开销!
八、协程常用方法
1)并发运行多个任务(最常用)
await asyncio.gather(t1, t2, t3)
2)创建后台任务(手动创建)
task = asyncio.create_task(coro())
3)超时控制
await asyncio.wait_for(task(), timeout=3)
4)屏蔽取消
await asyncio.shield(task())
九、协程实战案例
案例 1:异步爬虫(高并发)
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
print(f"{url} {resp.status}")
async def main():
urls = ["https://www.baidu.com"] * 5
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks)
asyncio.run(main())
案例 2:异步读写文件
import aiofiles
async def read_file():
async with aiofiles.open("test.txt") as f:
return await f.read()
十、同步 VS 多线程 VS 协程
表格
| 方式 | 开销 | 切换 | 并发 | 适合 |
|---|---|---|---|---|
| 同步 | 低 | 无 | 无 | 简单逻辑 |
| 多线程 | 高 | OS 切换 | 中 | CPU 密集 |
| 协程 | 极低 | 用户切换 | 极高 | I/O 密集 |
结论:网络请求、爬虫、API 服务 → 必须用协程!
十一、常见误区
- 普通函数不能用 await
- 协程不能直接调用,必须用 asyncio.run ()
- 同步库不能在协程里用(如 requests、time.sleep)
- 网络用 aiohttp
- 睡眠用 asyncio.sleep
十二、协程终极总结(背会就精通)
- async def 定义协程函数
- await 暂停等待异步操作
- asyncio 运行与调度
- 单线程、高并发、无锁、极轻量
- I/O 密集型场景神器
最强协程模板(直接复制用)
import asyncio
async def do_something():
# 异步操作
await asyncio.sleep(1)
return "ok"
async def main():
res = await do_something()
print(res)
asyncio.run(main())更多推荐



所有评论(0)