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()来启动事件循环并运行协程。

浙公网安备 33010602011771号