Python异步编程中await关键字如何确保多个协程完成后再执行后续操作?
python 异步编程中的 await 和 async
异步编程在 python 中是一个强大的工具,它允许应用程序处理耗时任务,而不会阻塞主进程。在您的问题中,您提到 await 似乎没有使 update_product_loop 函数异步。
await 和 async
您的问题
立即学习“Python免费学习笔记(深入)”;
在您提供的代码中,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 调用后才执行。