在 Python 3 中,async
和 await
是用于异步编程的关键字,它们用于定义和调用异步函数。异步编程允许程序在等待某些操作完成时(如网络请求、文件 I/O 等)执行其他任务,从而提高程序的效率和响应能力。
1. async
关键字
async
用于定义一个异步函数。异步函数是一种特殊的函数,它可以在执行过程中暂停,并在稍后恢复执行。这使得程序可以在等待某些耗时操作完成时执行其他任务。
示例:
python
async def fetch_data():
print("开始获取数据...")
await asyncio.sleep(2) # 模拟耗时操作
print("数据获取完成!")
return "数据"
async def
定义了一个异步函数fetch_data
。- 在函数内部,可以使用
await
来暂停函数的执行,直到某个异步操作完成。
2. await
关键字
await
用于调用一个异步函数或等待一个异步操作完成。它会暂停当前函数的执行,直到被等待的操作完成。await
只能用在 async
定义的异步函数中。
示例:
python
import asyncio
async def main():
print("主函数开始执行...")
result = await fetch_data() # 调用异步函数
print(f"主函数获取到数据: {result}")
print("主函数执行完成!")
# 运行异步主函数
asyncio.run(main())
- 在
main
函数中,使用await fetch_data()
调用了异步函数fetch_data
。 await
会暂停main
函数的执行,直到fetch_data
完成。
3. 异步函数的执行
异步函数需要通过事件循环来执行。在 Python 中,asyncio.run()
是启动事件循环的常用方法。
示例:
python
import asyncio
async def fetch_data():
print("开始获取数据...")
await asyncio.sleep(2) # 模拟耗时操作
print("数据获取完成!")
return "数据"
async def main():
print("主函数开始执行...")
result = await fetch_data() # 调用异步函数
print(f"主函数获取到数据: {result}")
print("主函数执行完成!")
# 运行异步主函数
asyncio.run(main())
4. 异步编程的优势
- 提高效率:在等待耗时操作时,程序可以执行其他任务,而不是阻塞等待。
- 提高响应能力:适用于需要处理大量并发任务的场景,如 Web 服务器、爬虫等。
5. 异步编程的注意事项
await
只能用在async
函数中 :如果在普通函数中使用await
,会报语法错误。- 异步函数的返回值 :异步函数返回的是一个
coroutine
对象,需要通过await
或事件循环来获取实际结果。 - 错误处理 :异步函数中可以使用
try-except
来捕获异常,但需要在await
调用时处理。
6. 示例:并发执行多个异步任务
python
import asyncio
async def fetch_data(url, delay):
print(f"开始获取数据: {url}")
await asyncio.sleep(delay) # 模拟耗时操作
print(f"数据获取完成: {url}")
return f"数据: {url}"
async def main():
urls = ["https://example.com", "https://example.org", "https://example.net"]
delays = [2, 3, 1]
tasks = [fetch_data(url, delay) for url, delay in zip(urls, delays)]
results = await asyncio.gather(*tasks) # 并发执行多个任务
print(f"所有任务完成,结果: {results}")
# 运行异步主函数
asyncio.run(main())
总结
async
用于定义异步函数。await
用于调用异步函数或等待异步操作完成。- 异步函数通过事件循环执行,
asyncio.run()
是启动事件循环的常用方法。 - 异步编程可以提高程序的效率和响应能力,特别适用于处理并发任务。
通过使用 async
和 await
,你可以编写高效的异步代码,提升程序的性能和用户体验。