一、什么是协程?

一句话定义

协程 = 可以暂停 / 恢复的函数 + 单线程内实现并发

  • 不需要多线程、多进程
  • 用户自己控制切换,不是操作系统切换
  • 极轻量、无切换开销、高并发性能极强

通俗比喻

你在烧水:

  • 同步:等着水开 → 啥也不干
  • 多线程:再叫一个人盯着水
  • 协程:水在烧,你去切菜 → 水快开了再回来

协程就是:一个人同时干多件事,遇到等待就切换!


二、协程的核心优势

  1. 极高并发:单线程可跑上万协程
  2. 极轻量:一个协程只需几 KB 内存
  3. 无锁竞争:单线程执行,不用加锁
  4. 切换极快:用户态切换,比线程快 100 倍
  5. 适合 I/O 密集型:网络请求、文件读写、数据库

三、Python 协程发展史(一句话)

  1. 生成器(yield)→ 实现基础协程
  2. 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 秒!这就是协程并发


七、协程运行原理(超级重要)

  1. async 定义的函数 不会直接运行,返回协程对象
  2. await 时:
    • 暂停当前协程
    • 去执行别的协程
    • 等待结束后自动回来继续
  3. 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 服务 → 必须用协程!


十一、常见误区

  1. 普通函数不能用 await
  2. 协程不能直接调用,必须用 asyncio.run ()
  3. 同步库不能在协程里用(如 requests、time.sleep)
    • 网络用 aiohttp
    • 睡眠用 asyncio.sleep

十二、协程终极总结(背会就精通)

  1. async def 定义协程函数
  2. await 暂停等待异步操作
  3. asyncio 运行与调度
  4. 单线程、高并发、无锁、极轻量
  5. 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())
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐