news 2026/4/23 19:12:23

Python 中的 `async` 和 `await` 入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 中的 `async` 和 `await` 入门

文章目录

    • 一、为什么需要异步?
    • 二、异步的好处
    • 三、Python 里的 `async` / `await`
      • 示例:
    • 四、关键点总结
    • 五、实际应用
    • 常见问题
      • 1. 被 async 修饰的函数,如果直接调用会怎么样?
      • 2. await 是做什么的?

在 Python 里,async/await用来写异步代码。它们的主要作用是: 👉 让程序同时处理多个任务,而不是一个个排队等。

一、为什么需要异步?

举个例子:

你写了一个程序,要做两件事:

  1. 下载一个文件(需要 5 秒)
  2. 打印 1 到 5 的数字

如果用普通(同步)的写法:

importtimedefdownload_file():print("开始下载...")time.sleep(5)# 模拟下载,卡住 5 秒print("下载完成!")defprint_numbers():foriinrange(1,6):print(i)time.sleep(1)download_file()print_numbers()

运行结果:

开始下载... (卡住 5 秒) 下载完成! 1 2 3 4 5

问题:

  • 下载的时候,程序被卡住,不能同时去做别的事情。

这就是同步—— 一件事没做完,下一件事只能等。

二、异步的好处

用异步就不一样了。下载的时候,程序不用干等,可以去做别的事情。等下载好了再回来继续。

这就像:

  • 同步:你烧水的时候,站在水壶前等 5 分钟,啥也不干。
  • 异步:你烧水的时候,顺便去切菜、洗菜。水开了再回来处理。

异步的目标就是提高效率

三、Python 里的async/await

  • async用来定义一个异步函数(叫做 coroutine 协程)。
  • await用来等待一个异步任务完成,在等待的同时,程序可以去干别的事。

示例:

importasyncio# 定义异步函数asyncdefdownload_file():print("开始下载...")awaitasyncio.sleep(5)# 模拟下载,不会卡住print("下载完成!")asyncdefprint_numbers():foriinrange(1,6):print(i)awaitasyncio.sleep(1)# 模拟耗时操作# 主函数asyncdefmain():# 同时执行两个任务awaitasyncio.gather(download_file(),print_numbers())# 运行asyncio.run(main())

运行结果:

开始下载... 1 2 3 4 5 下载完成!

你会发现:

  • 数字和下载是“同时”进行的。
  • 下载没有把程序卡死,两个任务在并发执行。

四、关键点总结

  1. 定义异步函数

    asyncdeffunc():...
  2. 调用异步函数时,要用await

    awaitfunc()
  3. 异步的好处

    • 适合 I/O 密集型任务(网络请求、读写文件、数据库操作)。
    • 不适合 CPU 密集型任务(比如复杂的数学计算),那还是多进程更好。
  4. asyncio.run()函数

作用是运行异步的主函数

参数:

  • coro: 要运行的异步函数
  • debug=False: 是否开启调试模式
asyncdefmain():print("Hello")asyncio.run(main())# 运行异步程序
  1. asyncio.gather()函数

作用是同时运行多个异步任务

参数:

  • delay: 等待的时间,单位是秒
awaitasyncio.sleep(1)# 等待1秒,期间可以运行其他任务
  1. asyncio.gather()函数

作用是并发执行多个异步任务

参数:

  • *aws: 多个异步任务(用逗号分隔)

  • return_exceptions=False: 是否将异常作为结果返回

# 同时执行3个任务,等待所有完成results=awaitasyncio.gather(task1(),task2(),task3())# 错误处理版本results=awaitasyncio.gather(task1(),task2(),task3(),return_exceptions=True# 异常不会抛出,而是作为结果返回)

五、实际应用

在 Python 的一些框架中(如FastAPI、aiohttp、Tornado),async/await被用来处理高并发请求。例如 FastAPI 里写接口时:

fromfastapiimportFastAPI app=FastAPI()@app.get("/")asyncdefhello():return{"message":"Hello, async world!"}

这里的async def就表示这个接口是异步的,可以同时处理很多用户的请求,而不会一个个卡着排队。

常见问题

1. 被 async 修饰的函数,如果直接调用会怎么样?

来看个例子:

importasyncioasyncdefhello():print("Hello")return"World"result=hello()print(result)

运行结果:

⚠️ 注意:不会打印 “Hello”。

原因是:

  • async def 定义的函数,调用后不会立刻执行,而是返回一个 协程对象(coroutine object)。
  • 这个协程对象就像一个“任务计划”,要等到 await 或事件循环(asyncio.run / asyncio.create_task 等)驱动时,才会真正执行。

所以直接调用只会得到“一个计划”,而不是结果。

2. await 是做什么的?

await就是用来 等待一个异步任务(协程对象)完成,并获取它的返回值。它只能在async函数里使用。

继续上面的例子:

importasyncioasyncdefhello():print("Hello")return"World"asyncdefmain():result=awaithello()# 这里才真正执行print("结果:",result)asyncio.run(main())

输出结果:

Hello 结果: World

流程解释:

  • hello() 返回一个协程对象。
  • await hello() 才会真正执行 hello() 里的代码,并拿到返回值。

注意

如果一个async函数没有写return,那它的返回值就是None,和普通函数完全一样。


👉点击进入我的网站

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 15:53:15

分布式存储数据恢复解析:以Ceph文件系统为例

在当今大数据时代,数据存储和管理已成为企业IT架构中的关键环节。分布式存储系统因其高可用性、高扩展性、低成本等优势,逐渐成为企业数据存储的首选。Ceph作为一款开源的分布式存储系统,受到了越来越多企业和单位的关注和采用。然而&#xf…

作者头像 李华
网站建设 2026/4/22 19:37:39

实战 | 高性能 AI 机器人 Clawdbot 容器化部署指南 (Docker + Python)

前言 在 AIGC 爆发的今天,拥有一款私有化、可定制的 AI 机器人是许多开发者和企业的需求。Clawdbot 是一款轻量级、响应速度极快的 AI 对话机器人后端(基于 Python/FastAPI 构建,支持 Claude 3.5/GPT-4o 模型)。它具备上下文记忆…

作者头像 李华
网站建设 2026/4/23 13:19:16

14. 字符串

1.字符串字面量 2.C 风格字符串(基于字符数组的字符串) 3.C 标准库 string 类 4.字符串字面量与 std::string 的转换 1.字符串字面量 字符串字面量是C中最基础的字符串形式, 你可以把它理解为直接用双引号""包裹的字符序列比如"hello…

作者头像 李华
网站建设 2026/4/23 16:15:24

成都周边千年古镇天花板!黄龙溪的美藏在流水与古巷里

黄龙溪古镇位于四川省成都市双流区的锦江与鹿溪河交汇处,是一座拥有超过一千七百年历史的川西水乡古镇。其得名源于自然景观:源自都江堰的锦江水色清澈,而发源于龙泉山的鹿溪河水色泛黄,两河交汇时,黄水汇入清江的景象…

作者头像 李华