携程(协程)是什么 + 作用 + Python 极简代码举例
协程(Coroutine)
简单一句话 :同一个线程里,来回切换执行多个任务,不用等一个卡死,就能跑下一个
适合:等待网络、等待IO、爬虫、接口请求、批量任务
协程核心作用
- 不占CPU,等待时自动切去干别的事
- 并发速度远超普通循环
- 开销比线程、进程小非常多
- 适合:爬虫、发请求、文件读写、接口批量调用
最简单易懂代码示例
1. 普通顺序执行(慢)
挨个等,干完一个才下一个
python
import time
def task(name):
print(f"{name} 开始干活")
time.sleep(2) # 模拟等待耗时
print(f"{name} 干完了")
start = time.time()
task("任务1")
task("任务2")
task("任务3")
end = time.time()
print(f"总耗时:{end - start:.2f} 秒")
运行结果:一共耗时 6秒左右
2. 协程并发执行(快很多)
等待的时候直接切去跑别的任务
python
import asyncio
import time
协程函数必须加 async
python
async def task(name):
print(f"{name} 开始干活")
await asyncio.sleep(2) # 协程专用等待(会让出资源)
print(f"{name} 干完了")
async def main():
start = time.time()
# 一次性并发运行多个协程
t1 = asyncio.create_task(task("任务1"))
t2 = asyncio.create_task(task("任务2"))
t3 = asyncio.create_task(task("任务3"))
await t1
await t2
await t3
end = time.time()
print(f"总耗时:{end - start:.2f} 秒")
#启动协程程序
asyncio.run(main())
运行结果:一共只耗时 2秒左右
关键区别看懂就会协程
- def 普通函数 → async def 协程函数
- time.sleep 卡死不动 → await asyncio.sleep 让出资源
- await:遇到等待,先去跑别的任务
- create_task:把任务丢进并发队列一起跑
实际常用场景:协程批量请求(爬虫例子)
python
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
text = await resp.text()
print(f"页面长度:{len(text)}")
async def main():
urls = [
"https://www.baidu.com",
"https://www.qq.com",
"https://www.sogou.com"
]
tasks = [fetch(u) for u in urls]
await asyncio.gather(*tasks)
asyncio.run(main())
一次性并发爬多个网站,速度飞快。
总结记忆
- 协程 = 单线程多任务切换
- 遇到等待就切任务,提升IO任务速度
- 关键字: async 、 await 、 create_task
- 适合:爬虫、接口、批量查询、定时任务