Python asyncio 异步编程:事件循环与并发原语

一、asyncio 解决了什么

Python 的 asyncio 用单线程事件循环实现并发,专为 IO 密集型任务设计:一个请求在等网络时,事件循环去跑别的协程,吞吐远超同步写法。

二、async / await 基本套路

import asyncio

async def fetch(name, sec):
    print(f"{name} 开始")
    await asyncio.sleep(sec)     # 模拟 IO 等待,让出控制权
    print(f"{name} 完成")
    return name

async def main():
    # 并发跑三个任务
    results = await asyncio.gather(
        fetch("A", 1), fetch("B", 2), fetch("C", 1)
    )
    print(results)

asyncio.run(main())

三、常见并发原语

原语 用途
gather 并发等一组任务全完成,拿全部结果
create_task 把协程提交给循环,立即返回 Task
Semaphore 限制并发数,防打爆下游
Queue 生产者消费者模型

四、两个致命误区

  • 在协程里调阻塞函数(如 time.sleep、同步 requests):会卡住整个事件循环,应改用 asyncio.sleep 或 aiohttp;
  • 以为 asyncio 能加速 CPU 计算:不能,CPU 密集请上多进程。

五、限流示例

sem = asyncio.Semaphore(5)   # 最多 5 个并发
async def safe_fetch(url):
    async with sem:
        async with aiohttp.ClientSession() as s:
            async with s.get(url) as r:
                return await r.text()

asyncio 上手不难,难在”别混用阻塞与异步”。守住这条,并发爬虫、并发 API 调用就能稳稳提速。