返回
剖析 Generator, async, await 的内在原理
前端
2023-10-08 15:44:26
Generator、async 和 await:Python 中异步编程的基础
Generator:让函数暂停并恢复
Python 中的 generator 是一种特殊的函数,可以生成一个值序列。使用 yield 语句,generator 可以在执行过程中暂停,并在再次被调用时从暂停的地方恢复执行。这使得 generator 非常适合生成遍历序列,例如斐波那契数列。
示例:生成斐波那契数列的 generator 函数
def fibonacci():
"""生成斐波那契数列。"""
a, b = 0, 1
while True:
yield a
a, b = b, a + b
async/await:异步编程的新时代
async/await 是 Python 3.5 中引入的两个,它们使我们能够编写异步代码。异步代码允许同时处理多个任务,而无需等待每个任务完成。这对于处理 I/O 密集型任务,例如网络请求,非常有用。
示例:异步获取数据的 async 函数
async def fetch_data():
"""从服务器获取数据。"""
url = 'https://example.com/data.json'
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
return data
Generator、async 和 await 的协同作用
Generator、async 和 await 可以协同工作,编写出更简洁、更具可读性的代码。例如,我们可以使用 generator 生成异步操作序列,然后使用 async/await 并行执行这些操作。
示例:并发获取数据的代码
async def fetch_data_concurrently():
"""并行获取数据。"""
urls = ['https://example.com/data1.json', 'https://example.com/data2.json']
async def fetch_data_from_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()
return data
tasks = [fetch_data_from_url(url) for url in urls]
data = await asyncio.gather(*tasks)
return data
常见问题解答
-
generator 和 async 函数之间的区别是什么?
- generator 是生成值序列的函数,而 async 函数是处理异步操作的函数。
-
如何使用 await 暂停 async 函数?
- 使用 await 关键字暂停 async 函数,直到指定的异步操作完成。
-
generator 如何与 async 函数协同工作?
- generator 可用于生成异步操作序列,而 async 函数可用于并行执行这些操作。
-
async/await 带来了哪些好处?
- async/await 使我们能够编写异步代码,提高了 I/O 密集型任务的效率。
-
在哪些场景下可以使用 generator、async 和 await?
- generator 可用于生成序列、斐波那契数等。
- async 函数可用于处理网络请求、数据库查询等。
- generator 和 async 函数可协同用于编写并发、可读的代码。