【协程coroutine】async await
async
和 await
是 Python 3.5 及以上版本中引入的用于编写异步代码的关键词。它们帮助开发者编写出简洁且高效的异步 IO 操作,比如网络请求、文件读写等,避免阻塞主线程。
以下是async
和 await
的简单介绍和使用示例:
1. async
关键词
async
用于定义协程(coroutine),协程是一种能在执行过程中暂停并在需要时继续执行的函数。带有 async
关键字的函数被称为异步函数或协程函数。
import asyncioasync def my_coroutine():print("Hello")await asyncio.sleep(1)print("World")# 调用协程函数不会立即执行,需要用`await`或在事件循环中运行
2. await
关键词
await
用于在协程中等待一个异步操作完成。它只能在async
定义的函数中使用。
async def say_hello():print("Hello")await asyncio.sleep(1) # 模拟异步操作print("World")# 像这样直接运行不会有输出
say_hello()
3. 使用事件循环执行协程
为了执行协程,需要将它们放到事件循环(event loop)中运行。Python 提供了 asyncio.run
方法来简化这个过程。
import asyncioasync def say_hello():print("Hello")await asyncio.sleep(1)print("World")# 运行协程函数
asyncio.run(say_hello())
当你运行上述代码时,输出将会是:
Hello
<暂停1秒>
World
4. 常见用法与示例
假设你想并发执行多个异步操作,比如抓取网页内容。可以使用 async
和 await
来达到并发执行的效果。
import asyncioasync def fetch_data(delay, data):print(f"Fetching {data} with delay {delay}s")await asyncio.sleep(delay)print(f"Fetched {data}")async def main():tasks = [fetch_data(2, "data1"),fetch_data(1, "data2"),fetch_data(3, "data3")]await asyncio.gather(*tasks)asyncio.run(main())
在这个例子中,asyncio.gather
用来并发地执行多个协程。协程 fetch_data
会并发执行,而不是顺序执行,大大提高了效率。
总结
async
用于定义异步函数。await
在异步函数中等待另一个异步操作完成。- 使用
asyncio.run
或 事件循环来调度执行协程。
掌握 async
和 await
能大大提升你在处理 IO 密集型任务,如网络请求和文件操作时的代码效率和结构清晰度。