FastApi高效异步并发复习

first_coroutine

import asyncio


# 定义一个协程
async def main():
    print("Hello")
    await asyncio.sleep(1)  # 模拟异步操作
    # 在协程中,对于那些会发生I/O阻塞的操作,使用await来等待它们完成,不能使用time.sleep
    print("World")


if __name__ == "__main__":
    cor = main()  # 创建协程对象

    asyncio.run(cor)  # 运行协程

2async_time统计时间装饰器

import time

from functools import wraps


def async_time(func):
    @wraps(func)
    async def wrapper(*args, **kwargs):
        print(f"开始执行{func},参数:{args}, {kwargs}")
        start_time = time.time()
        try:
            return await func(*args, **kwargs)
        except Exception as e:
            print(f"An error occurred: {e}")
            raise
        finally:
            end_time = time.time()
            total_time = end_time - start_time
            print(f"结束执行{func},耗时:{total_time:.4f}秒")

    return wrapper


import asyncio
import time
from utils import async_time


# 定义一个协程

@async_time
async def main():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

# 上诉@async_time和async def main()等价于:
# wrapper = async_time(main)  # 将main函数传递给async_time装饰器


if __name__ == "__main__":
    cor = main()  # 创建协程对象

    asyncio.run(cor)  # 运行协程


3concurrency

import asyncio
from utils import async_time

async def greet(name, delay):
    await asyncio.sleep(delay)
    print(f"Hello, {name}!")

# todo 这样写是同步运行没有达到并发的效果
# @async_time
# async def main():
#     # 执行两个协程
#     result1 = await greet("Alice", 3)
#     print(result1)
#     result2 = await greet("Bob", 2)
#     print(result2)

# 执行的结果如下:
"""
开始执行<function main at 0x000002214FFBA020>,参数:(), {}
Hello, Alice!
None
Hello, Bob!
None
结束执行<function main at 0x000002214FFBA020>,耗时:5.0037秒
"""

# todo 这样写是并发运行的
# @async_time
# async def main():
#     # 并发运行,必须要将协程包装成Task任务对象,才能够并发执行
#     task1 = asyncio.create_task(greet("Alice", 3))
#     task2 = asyncio.create_task(greet("Bob", 2))
#     # 对创建好的应用进行await
#     result1 = await task1
#     print(result1)
#     result2 = await task2
#     print(result2)

# 执行的结果如下:
"""
开始执行<function main at 0x000001FEB7A93CE0>,参数:(), {}
Hello, Bob!
Hello, Alice!
None
None
结束执行<function main at 0x000001FEB7A93CE0>,耗时:3.0150秒
"""

# todo 一下是错误写法
# @async_time
# async def main():
#     # 这样直接运行没有一点效果执行时间
#     task1 = await asyncio.create_task(greet("Alice", 3))
#     print(task1)
#     task2 = await asyncio.create_task(greet("Bob", 2))
#     print(task2)
# 执行的结果如下:
"""
开始执行<function main at 0x0000025842C03CE0>,参数:(), {}
Hello, Alice!
None
Hello, Bob!
None
结束执行<function main at 0x0000025842C03CE0>,耗时:5.0237秒
"""
@async_time
async def main():
    # 并发运行,必须要将协程包装成Task任务对象,才能够并发执行
    task1 = asyncio.create_task(greet("Alice", 3))
    task2 = asyncio.create_task(greet("Bob", 2))
    # 对创建好的应用进行await
    r1 = await task1
    print(r1)
    r2 = await task2
    print(r2)
"""
开始执行<function main at 0x000001E8E3653CE0>,参数:(), {}
Hello, Bob!
Hello, Alice!
None
None
结束执行<function main at 0x000001E8E3653CE0>,耗时:2.9943秒
"""


if __name__ == "__main__":
    asyncio.run(main())

tomrrow:https://www.bilibili.com/video/BV16kTazbEwe?spm_id_from=333.788.player.switch&vd_source=3ef97fd9754fa6319c22dc6f1b4b3275&p=7

posted @ 2025-08-19 00:51  鞭码形动  阅读(11)  评论(0)    收藏  举报