如何在Python中创建更优协程:异步函数并行无阻塞执行需求
实现异步函数并行执行的方法
你的问题根源在于每次调用asyncio.run()都会启动一个独立的事件循环,两个循环串行执行,所以第二个函数必须等第一个循环结束才会运行。要让两个异步函数互不阻塞、同时运行,需要把它们放到同一个事件循环里执行,下面提供两种常用实现方式:
1. 同时启动多个异步函数(已知需并行的函数)
使用asyncio.gather()可以将多个协程打包,让它们在同一个事件循环里并行执行:
import asyncio async def func1(): await asyncio.sleep(1) print("func1 completed") async def func2(): await asyncio.sleep(1) print("func2 completed") async def main(): # 同时运行func1和func2 await asyncio.gather(func1(), func2()) asyncio.run(main())
运行后两个函数会同时开始执行,1秒后几乎同时输出结果(顺序可能因调度略有不同),符合你想要的无额外延迟的效果。
2. 动态触发异步函数(不确定调用时机)
如果两个函数的调用时机不确定(比如一个在某个事件触发后才调用),可以用asyncio.create_task()将协程包装成任务,添加到当前事件循环中,这样新任务会和已有任务并行执行:
import asyncio async def func1(): await asyncio.sleep(1) print("func1 completed") async def func2(): await asyncio.sleep(1) print("func2 completed") async def main(): # 先启动func1任务 task1 = asyncio.create_task(func1()) # 模拟不确定的延迟后启动func2 await asyncio.sleep(0.5) task2 = asyncio.create_task(func2()) # 等待所有任务完成(如果需要等待结果的话) await task1 await task2 asyncio.run(main())
这种方式下,func1启动0.5秒后func2才启动,但两个任务在各自的sleep期间不会互相阻塞,总耗时约1秒(而非1+1=2秒)。
关键说明
- 不要在同一个程序里多次调用
asyncio.run(),除非你明确需要独立的事件循环。 create_task()是动态添加并行任务的核心,只要在同一个事件循环中,任务就会被异步调度执行,互不阻塞。
内容的提问来源于stack exchange,提问作者evgehatop213
相关产品推荐
相关产品推荐

