协程详细介绍

携程(协程)是什么 + 作用 + Python 极简代码举例

协程(Coroutine)

简单一句话 :同一个线程里,来回切换执行多个任务,不用等一个卡死,就能跑下一个
适合:等待网络、等待IO、爬虫、接口请求、批量任务

协程核心作用

  1. 不占CPU,等待时自动切去干别的事
  2. 并发速度远超普通循环
  3. 开销比线程、进程小非常多
  4. 适合:爬虫、发请求、文件读写、接口批量调用

最简单易懂代码示例

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秒左右

关键区别看懂就会协程

  1. def 普通函数 → async def 协程函数
  2. time.sleep 卡死不动 → await asyncio.sleep 让出资源
  3. await:遇到等待,先去跑别的任务
  4. 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
  • 适合:爬虫、接口、批量查询、定时任务
相关推荐
张张123y24 分钟前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
冻柠檬飞冰走茶3 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing034 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊4 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6755 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩5 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11077 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19907 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19907 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala
三*一8 小时前
Mapbox‑GL JS 多边形折点编辑工具:实现原理、功能拆解与踩坑总结
开发语言·javascript·ecmascript