异步函数与异步生成器

异步函数介绍

定义:使用 async def 关键字定义的函数,可以暂停执行并在稍后恢复

特点:函数内部可以使用 await 关键字等待其他异步操作完成

返回值:调用时返回协程对象(coroutine),而不是直接执行函数体

性能方面:

  • I/O 密集型:异步并发优势明显
  • CPU 密集型:对于计算密集型任务,异步并不能带来性能提升

其它:避免在异步函数中使用阻塞操作,如 time.sleep(),使用异步版本的操作,如 await asyncio.sleep()

定义

复制代码
async def function_name(parameters):
    # 异步函数体
    await some_async_operation()
    return result

定义要点

  • 使用 async def 替代普通函数的 def
  • 函数内部可以使用 await 关键字
  • 可以使用 return 返回值

调用

在异步环境中调用

  • 使用 await:在另一个异步函数中使用 await function_name()
  • 返回协程对象:直接调用 function_name() 返回协程对象

在同步环境中调用

  • 使用 asyncio.run():asyncio.run(function_name())
  • 创建事件循环:手动创建和管理事件循环

示例

同步环境中调用:asyncio.run

示例:

复制代码
async def hello():
    print("全栈测试笔记")
    return "qzcsbj"


res = hello()
print(res, type(res))

输出结果

复制代码
<coroutine object hello at 0x0000023CA3CA5B40> <class 'coroutine'>
<sys>:0: RuntimeWarning: coroutine 'hello' was never awaited

上面直接调用异步函数hello()会返回一个协程对象,而不是执行函数

修改:asyncio.run()是运行异步函数的标准方式

复制代码
import asyncio


async def hello():
    print("全栈测试笔记")
    return "qzcsbj"


res = hello()
print(res, type(res))
res2 = asyncio.run(res)
print(res2, type(res2))

输出结果:

复制代码
<coroutine object hello at 0x00000216F8162680> <class 'coroutine'>
全栈测试笔记
qzcsbj <class 'str'>

优化

复制代码
import asyncio


async def hello():
    print("全栈测试笔记")
    return "qzcsbj"


if __name__ == "__main__":
    res = hello()
    print(res, type(res))
    res2 = asyncio.run(res)
    print(res2, type(res2))

执行流程:

  • asyncio.run(hello()) 直接启动事件循环
  • 直接执行 hello() 函数并返回结果
  • 简洁的单函数执行模
异步环境中调用:await
复制代码
import asyncio


async def hello():
    print("全栈测试笔记")
    return "qzcsbj"


async def call_hello():
    res = hello()
    print(res, type(res))
    res2 = await res  # await res等价于await hello()
    print(res2, type(res2))


if __name__ == "__main__":
    # call_hello()  # 报错:coroutine 'call_hello' was never awaited call_hello()
    asyncio.run(call_hello())

输出结果:

复制代码
<coroutine object hello at 0x0000023816222680> <class 'coroutine'>
全栈测试笔记
qzcsbj <class 'str'>

执行流程:

  • asyncio.run(call_hello()) 启动事件循环
  • call_hello() 内部先获取 hello() 的协程对象
  • 通过 await 等待协程执行完成
  • 演示了协程对象的创建和等待过程

异步生成器

参考:https://www.cnblogs.com/uncleyong/p/6208547.html

相关推荐
程序员黑豆2 分钟前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
光影少年2 分钟前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架
鸿芯微控科技3 分钟前
MFC关断后还有流量怎么办?零流量、阀门泄漏、压差与Python分析
c++·python·mfc·质量流量控制器·关断泄漏·零流量测试
Canace8 分钟前
笔记本都合上了,Claude 为什么还能在手机上执行电脑上装的技能?
前端·人工智能·ai编程
TDengine (老段)15 分钟前
TDengine 第三方工具 — Telegraf、Kafka Connect、Flink、Spark
大数据·数据库·物联网·flink·kafka·时序数据库·tdengine
cyadyx1 小时前
Vite 比 Webpack 构建效率更高
前端·webpack·node.js·vite
点云-激光雷达-Slam-三维牙齿2 小时前
速度起飞 笔记本电脑6G显卡llama运行Qwen3.6 35BA3B MTP 大模型
人工智能·python·电脑·llama
mCell3 小时前
AI 时代 SVG 画图的潜力
前端·agent·svg
言乐63 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
桑榆4164 小时前
双系统(Windows + Ubuntu)安装流程
linux·windows·ubuntu