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
相关推荐
牛奶2 小时前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶3 小时前
前端人为什么要学AI?
前端·人工智能·ai编程
皮皮林5513 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河4 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
Kagol5 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路6 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide6 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
桦说编程6 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
ssshooter7 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js