python中的异步调用(直接使用教程)

1、异步协程(async def + return)

代码案例:

python 复制代码
import asyncio

async def Add():
    return 1+2

if(__name__=="__main__"):
    #这里是形成一个异步协程对象放在了变量a中,函数还没开始执行
    a = Add()
    #现在开始执行Add这个异步协程,是阻塞的,等待Add执行完,再继续执行主协程
    result = asyncio.run(a)
    print(result)


输出:
3

2、同步生成器(def + yield)

代码案例:

python 复制代码
import asyncio

#这个函数的意思是,会有多次返回的结果,例如我第一次调用它,它会返回0,第二次调用它,它返回1,依次类推
def addd():
    yield 0
    yield 1
    yield 2
    yield 3

if __name__ == '__main__':
# 我们现在看如何调用这个函数
  #第一种方法:
    #还是先形成一个对象
    gen = addd()
    #通过next循环调用这个对象,这里只调了三次
    result = next(gen)
    print(result)
    result = next(gen)
    print(result)
    result = next(gen)
    print(result)
  #第二种方法
    #还是先形成一个对象
    gen2 = addd()
    #通过for循环调用这个对象
    for i in gen2:
        print(i)

输出:
0
1
2
0
1
2
3

3、异步生成器(async def + 有yield)

代码案例:

python 复制代码
import asyncio

#这里也是会多次返回结果
async def Add():
    yield 2
    yield 3

async def comsume():
    a = Add()
    #async for 只能写在异步协程里,所以需要封装一层函数
    async for i in a:
        #通过async for 循环调用拿到结果
        print(i)
    return "success"

if __name__ == '__main__':
    result = asyncio.run(comsume())
    print(result)

输出:
2
3
success

4、如何在异步协程中 调用 异步协程

代码案例:

python 复制代码
import asyncio

async def add():
    return 2

# 定义一个简单的异步协程(模拟耗时操作)
async def async_task(delay):
    #在协程内部,我们使用create_task启动一个新的协程
    task = asyncio.create_task(add())
    #如果我们想要获得子协程的结果,使用await
    result = await task
    return result

if __name__ == '__main__':
    #调用第一个协程使用run
    result = asyncio.run(async_task(6))
    print(result)

输出:
2

5、如何实现并发

代码案例:

python 复制代码
import asyncio
import time

# 定义一个简单的异步协程(模拟耗时操作)
async def async_task(delay):
    print(f"开始执行异步任务,延迟 {delay} 秒")
    await asyncio.sleep(delay)#  异步睡眠
    return f"任务执行完成(延迟 {delay} 秒)"

async def async_main2():
    #非阻塞
    #使用create_task启动2个新的子协程,同时主协程仍然在执行
    task1 = asyncio.create_task(async_task(2))
    task2 = asyncio.create_task(async_task(3))
    # 使用await,暂停当前主协程的执行,开始等待子协程的结果
    result3 = await task1
    result4 = await task2
    return result3, result4

async def async_main1():
    # 阻塞,相当于直接直接启动一个子协程,同时主协程暂停,等待这个子协程的结果
    result1 = await async_task(2)
    #再启动一个子协程,主协程暂停,等待结果
    result2 = await async_task(3)
    return result1, result2

if __name__ == '__main__':
    time1 = time.time()
    result = asyncio.run(async_main1())
    print(result)
    print("耗时",time.time() - time1)

    time2 = time.time()
    result = asyncio.run(async_main2())
    print(result)
    print("耗时:",time.time() - time2)

输出:
开始执行异步任务,延迟 2 秒
开始执行异步任务,延迟 3 秒
('任务执行完成(延迟 2 秒)', '任务执行完成(延迟 3 秒)')
耗时 5.006885051727295
开始执行异步任务,延迟 2 秒
开始执行异步任务,延迟 3 秒
('任务执行完成(延迟 2 秒)', '任务执行完成(延迟 3 秒)')
耗时: 3.019955635070801
相关推荐
百***24372 小时前
DeepSeek-V3.2全解析:开源大模型的性能巅峰与落地实践指南
python·开源
xkxnq2 小时前
第四阶段:Vue 进阶与生态整合(第 47 天)(Vue 项目目录结构解析:每个文件夹的作用与规范)
前端·javascript·vue.js
CodeAmaz2 小时前
文件断点续传完整方案
java·文件断点上传
像少年啦飞驰点、2 小时前
零基础入门 Spring Boot:从‘Hello World’到可部署微服务的完整学习路径
java·spring boot·web开发·编程入门·后端教程
方安乐2 小时前
杂记:Quart和Flask比较
后端·python·flask
m0_748248652 小时前
C++正则表达式攻略:从基础到高级应用
java·c++·正则表达式
墨雨晨曦882 小时前
leedcode刷题总结
java·开发语言
炽烈小老头2 小时前
浏览器渲染原理:从 HTML 到像素的全链路拆解
前端
打小就很皮...2 小时前
React 合同审查组件:按合同原文定位
前端·react.js·markdown