async await用法 python
时间: 2024-12-25 15:20:34 浏览: 6
### Python 中 `async` 和 `await` 的使用
#### 定义与作用
在 Python 编程语言中,`async` 和 `await` 是用于定义和处理异步函数的关键字。这两个关键字允许编写非阻塞代码来执行耗时的任务而不影响程序的整体性能。
- **`async` 关键字**:当声明一个函数为 `async def` 时,则该函数被标记为协程(coroutine),意味着它可以暂停并稍后恢复其执行。
- **`await` 关键字**:此关键字仅能在由 `async def` 声明的函数体内使用;它会暂停当前协程直到右侧表达式的返回值可用——即等待另一个协程的结果或任何实现了 `__await__()` 方法的对象(称为可等待对象)[^2]。
#### 创建简单的异步函数
下面展示如何创建一个基本的异步函数:
```python
import asyncio
async def say_hello():
print("Hello")
await asyncio.sleep(1) # 模拟了一个耗时的操作
print("World")
# 运行这个异步函数
asyncio.run(say_hello())
```
这段代码首先打印 "Hello",接着调用了 `await asyncio.sleep(1)` 来模拟一次延迟一秒的操作,在这段时间里事件循环可以去运行其他的任务,最后再继续执行剩余部分并打印 "World"。
#### 并发执行多个异步任务
为了并发地启动多个异步操作,可以通过 `gather()` 或者 `ensure_future()` 实现多任务调度:
```python
async def download_image(url):
print(f"Start downloading {url}")
await asyncio.sleep(0.5) # 模拟下载过程中的延时
print(f"Finished downloading {url}")
async def main(urls):
tasks = []
for url in urls:
task = asyncio.ensure_future(download_image(url))
tasks.append(task)
await asyncio.gather(*tasks)
urls = ["http://example.com/image1.jpg", "http://example.com/image2.png"]
asyncio.run(main(urls))
```
在这个例子中,通过遍历 URL 列表创建了一系列代表不同图片下载请求的任务,并利用 `gather()` 同时发起这些请求。这使得所有图像几乎在同一时间开始加载而不是依次排队等候[^3]。
阅读全文