async 与 await

async 和 await 是用于编写异步代码的关键字,允许程序在执行 I/O 操作(如网络请求、文件读写等)时不阻塞其他代码的执行。这样可以提高程序的并发性能,使其在处理多个任务时更加高效。

async 用于定义一个异步函数(协程),而 await 用于暂停协程的执行,等待某个耗时操作完成。通过这种方式,程序可以在等待过程中执行其他任务。

以下是一个简单的 Python 异步编程示例,展示如何使用 async 和 await:

import asyncio
import time


# 定义协程
async def task(name, delay):
    print(f"Task {name} start")
    await asyncio.sleep(delay)  # 模拟耗时任务
    print(f"Task {name} done")
    return f"Result {name}"


# 使用 TaskGroup 并发运行协程
async def main():
    start = time.perf_counter()
    async with asyncio.TaskGroup() as tg:
        task_a = tg.create_task(task("A", 1))
        task_b = tg.create_task(task("B", 2))
    # All tasks are finished when the async with block exits
    print(f"results: {[task_a.result(), task_b.result()]}")
    print(f"elapsed: {time.perf_counter() - start:.1f}s")


# 运行事件循环
asyncio.run(main())
  • 只有协程才能调用协程。调用方法是 await task()。

    当执行 await task() 时,当前协程(调用 await 的协程)会将控制权交回给事件循环。

    事件循环会将 task 协程加入调度队列,并可能立即开始执行 task,但这取决于事件循环的当前状态和其他任务的优先级。

    如果 task 需要等待某些异步操作(比如 I/O 操作)完成,事件循环会在等待期间切换去执行其他准备就绪的任务。

    一旦 task 完成,它会把控制权交还给事件循环,事件循环再继续执行 await task() 之后的代码。

  • 如果要在非异步函数中调用协程,需要使用 asyncio.run() 来启动事件循环并运行协程。

posted @ 2024-12-25 10:16  undefined443  阅读(100)  评论(0)    收藏  举报