返回

剖析 Generator, async, await 的内在原理

前端

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

常见问题解答

  1. generator 和 async 函数之间的区别是什么?

    • generator 是生成值序列的函数,而 async 函数是处理异步操作的函数。
  2. 如何使用 await 暂停 async 函数?

    • 使用 await 关键字暂停 async 函数,直到指定的异步操作完成。
  3. generator 如何与 async 函数协同工作?

    • generator 可用于生成异步操作序列,而 async 函数可用于并行执行这些操作。
  4. async/await 带来了哪些好处?

    • async/await 使我们能够编写异步代码,提高了 I/O 密集型任务的效率。
  5. 在哪些场景下可以使用 generator、async 和 await?

    • generator 可用于生成序列、斐波那契数等。
    • async 函数可用于处理网络请求、数据库查询等。
    • generator 和 async 函数可协同用于编写并发、可读的代码。