python3中的 async 与 await关键字,实现异步编程

在 Python 3 中,asyncawait 是用于异步编程的关键字,它们用于定义和调用异步函数。异步编程允许程序在等待某些操作完成时(如网络请求、文件 I/O 等)执行其他任务,从而提高程序的效率和响应能力。

1. async 关键字

async 用于定义一个异步函数。异步函数是一种特殊的函数,它可以在执行过程中暂停,并在稍后恢复执行。这使得程序可以在等待某些耗时操作完成时执行其他任务。

示例:

python 复制代码
async def fetch_data():
    print("开始获取数据...")
    await asyncio.sleep(2)  # 模拟耗时操作
    print("数据获取完成!")
    return "数据"
  • async def 定义了一个异步函数 fetch_data
  • 在函数内部,可以使用 await 来暂停函数的执行,直到某个异步操作完成。

2. await 关键字

await 用于调用一个异步函数或等待一个异步操作完成。它会暂停当前函数的执行,直到被等待的操作完成。await 只能用在 async 定义的异步函数中。

示例:

python 复制代码
import asyncio

async def main():
    print("主函数开始执行...")
    result = await fetch_data()  # 调用异步函数
    print(f"主函数获取到数据: {result}")
    print("主函数执行完成!")

# 运行异步主函数
asyncio.run(main())
  • main 函数中,使用 await fetch_data() 调用了异步函数 fetch_data
  • await 会暂停 main 函数的执行,直到 fetch_data 完成。

3. 异步函数的执行

异步函数需要通过事件循环来执行。在 Python 中,asyncio.run() 是启动事件循环的常用方法。

示例:

python 复制代码
import asyncio

async def fetch_data():
    print("开始获取数据...")
    await asyncio.sleep(2)  # 模拟耗时操作
    print("数据获取完成!")
    return "数据"

async def main():
    print("主函数开始执行...")
    result = await fetch_data()  # 调用异步函数
    print(f"主函数获取到数据: {result}")
    print("主函数执行完成!")

# 运行异步主函数
asyncio.run(main())

4. 异步编程的优势

  • 提高效率:在等待耗时操作时,程序可以执行其他任务,而不是阻塞等待。
  • 提高响应能力:适用于需要处理大量并发任务的场景,如 Web 服务器、爬虫等。

5. 异步编程的注意事项

  • await 只能用在 async 函数中 :如果在普通函数中使用 await,会报语法错误。
  • 异步函数的返回值 :异步函数返回的是一个 coroutine 对象,需要通过 await 或事件循环来获取实际结果。
  • 错误处理 :异步函数中可以使用 try-except 来捕获异常,但需要在 await 调用时处理。

6. 示例:并发执行多个异步任务

python 复制代码
import asyncio

async def fetch_data(url, delay):
    print(f"开始获取数据: {url}")
    await asyncio.sleep(delay)  # 模拟耗时操作
    print(f"数据获取完成: {url}")
    return f"数据: {url}"

async def main():
    urls = ["https://example.com", "https://example.org", "https://example.net"]
    delays = [2, 3, 1]
    tasks = [fetch_data(url, delay) for url, delay in zip(urls, delays)]
    results = await asyncio.gather(*tasks)  # 并发执行多个任务
    print(f"所有任务完成,结果: {results}")

# 运行异步主函数
asyncio.run(main())

总结

  • async 用于定义异步函数。
  • await 用于调用异步函数或等待异步操作完成。
  • 异步函数通过事件循环执行,asyncio.run() 是启动事件循环的常用方法。
  • 异步编程可以提高程序的效率和响应能力,特别适用于处理并发任务。

通过使用 asyncawait,你可以编写高效的异步代码,提升程序的性能和用户体验。

相关推荐
IT_陈寒9 分钟前
Redis并发写入踩坑记录:别让超时设置坑了你
前端·人工智能·后端
Bs_MoneyMagnet15 分钟前
基于springboot+vue的图书馆预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·图书管理系统·计算机毕业设计
console.log('npc')25 分钟前
03 — 核心框架:App 与中间件
后端·node.js·express
小蒜学长25 分钟前
基于小程序的绘画作品创作与分享社区系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·绘画作品·创作分享社区
江湖十年35 分钟前
Go GOPROXY 兜底链的坑:从一次诡异的 CI lint 失败说起
后端·面试·go
考虑考虑8 小时前
docker compose V2版本新属性
运维·后端·自动化运维
GreenTea10 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构
Flynt11 小时前
Java 27 升级实测:默认值动得比新特性多,有个老参数会让 JVM 直接起不来
java·jvm·后端
Bs_MoneyMagnet11 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
GreenTea11 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法