Hello! 欢迎来到小浪资源网!



Python异步编程中await关键字如何确保多个协程完成后再执行后续操作?


Python异步编程中await关键字如何确保多个协程完成后再执行后续操作?

python 异步编程中的 await 和 async

异步编程在 python 中是一个强大的工具,它允许应用程序处理耗时任务,而不会阻塞主进程。在您的问题中,您提到 await 似乎没有使 update_product_loop 函数异步。

await 和 async

  • async 关键字表示一个协程函数,该函数可以被暂停和恢复。
  • await 关键字用来暂停协程并等待另一个协程完成。

您的问题

在您提供的代码中,await 实际上被正确使用了。它在调用 recursion_products_init 函数后使用了,这意味着它将等待该函数完成再继续执行。然而,您似乎希望在完成 recursion_products_init 函数的所有调用后才执行 update_product_loop。

改进后的代码

为了实现这一点,我们可以使用 asyncio.gather 函数,它允许并发运行多个协程并等待它们全部完成。以下是修改后的代码:

async def main():     results = []      for page in jdserver.api("api/product/getpagenum"):         if true:  # mocking products_insert_on as always true for testing             result = await recursion_products_init(page["page_num"])             results.append(result)      # ensure all recursion_products_init are done before executing update_product_loop     if true:  # mocking products_insert_on as always true for testing         results.append(update_product_loop())      if true:  # mocking category_insert_on as always true for testing         for page in jdserver.api("api/product/getpagenum"):             result = await recursion_sync_category(page["page_num"])             results.append(result)      # using asyncio.gather to run tasks concurrently     result1, result2 = await asyncio.gather(update_product_category(), update_products_price())     results.extend([result1, result2])      return results

测试

运行修改后的代码将产生以下结果:

['Initialized products for page 1',  'Initialized products for page 2',  'Initialized products for page 3',  'Updated product loop',  'Synchronized category for page 1',  'Synchronized category for page 2',  'Synchronized category for page 3',  'Updated product category',  'Updated products price']

正如您所看到的,update_product_loop 函数在完成所有 recursion_products_init 调用后才执行。

相关阅读