Python 协程
一、什么是协程一句话定义协程 可以暂停 / 恢复的函数 单线程内实现并发不需要多线程、多进程由用户自己控制切换不是操作系统切换极轻量、无切换开销、高并发性能极强通俗比喻你在烧水同步等着水开 → 啥也不干多线程再叫一个人盯着水协程水在烧你去切菜 → 水快开了再回来协程就是一个人同时干多件事遇到等待就切换二、协程的核心优势极高并发单线程可跑上万协程极轻量一个协程只需几 KB 内存无锁竞争单线程执行不用加锁切换极快用户态切换比线程快 100 倍适合 I/O 密集型网络请求、文件读写、数据库三、Python 协程发展史一句话生成器yield→ 实现基础协程asyncio async/await→ 现代协程Python 3.7现在只用学async /await四、协程核心关键字必背async定义一个协程函数await暂停当前协程等待异步操作完成asyncioPython 官方异步库运行协程五、最简单协程示例入门必看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不是 1236s 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(), timeout3)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())