不等待调用async函数是否会阻塞?如何无等待执行非阻塞代码?
异步函数无等待调用的问题解答
1. 不关注返回结果时,是否仍需使用await?
不用。但直接调用异步函数却不加await的话,函数不会实际执行,只会返回一个协程对象,这个对象会被闲置,除非你通过事件循环去调度它运行。
举个Python的例子:
async def do_something(): # 模拟耗时IO操作 await asyncio.sleep(2) print("操作完成") # 直接调用仅得到协程对象,函数内容不会执行 do_something()
这种情况下,do_something里的代码根本不会运行,更谈不上非阻塞执行。
2. 无需等待即可执行非阻塞代码的方法
如果你想让异步函数在后台执行、不阻塞当前线程,同时不用等待它的结果,可以通过事件循环的任务调度方法实现:
方法:用asyncio.create_task()(Python 3.7+)
把协程包装成任务,事件循环会自动在后台调度执行,当前代码可以继续往下走,完全不阻塞。
import asyncio async def do_something(): await asyncio.sleep(2) print("后台操作完成") async def main(): # 将协程转为任务,丢给事件循环后台执行 asyncio.create_task(do_something()) print("当前代码继续执行,不等待后台任务") await asyncio.sleep(3) # 留足够时间让后台任务完成 asyncio.run(main())
运行后会先打印"当前代码继续执行...",2秒后打印"后台操作完成",3秒后程序结束。
注意点
- 如果程序在后台任务完成前就退出,任务会被直接终止,所以要确保事件循环在任务运行期间保持活跃。
- 若任务抛出未被捕获的异常,程序退出时会默认打印异常信息,你也可以给任务添加回调来处理异常。
内容的提问来源于stack exchange,提问作者Jero Lopez
相关产品推荐
相关产品推荐

