启动异步任务遇错误:如何让say_hi()立即执行且无需等待?
异步任务调度问题解决
需求说明
在start函数中,需要实现:
- 通过
create_task创建的write_file()和take_time()两个函数异步并行执行(已实现) - 异步函数
say_hi()启动时立即执行,既不等待其他函数完成,也无需等待自身执行完毕
遇到的错误
移除say_hi()前的await时,出现以下警告:
RuntimeWarning: coroutine 'say_hi' was never awaited say_hi() RuntimeWarning: Enable tracemalloc to get the object allocation traceback
原代码
import asyncio from datetime import datetime async def say_hi(): task = asyncio.sleep(1) print("HI") await task async def start(): asyncio.create_task(write_file()) await say_hi() asyncio.create_task(take_time(time=datetime.now())) print("hi") async def main(): tasks = [ start(), ] await asyncio.gather(*tasks) asyncio.run(main())
解决方法
在asyncio中,直接调用协程函数(如say_hi())只会创建一个协程对象,不会被事件循环调度执行,因此会触发未await的警告。要让say_hi()立即异步执行,需像另外两个函数一样用asyncio.create_task()包装,将其加入事件循环调度,无需await即可启动,也不会阻塞后续代码执行。
修改后的代码
import asyncio from datetime import datetime async def say_hi(): task = asyncio.sleep(1) print("HI") await task # 补充原代码中缺失的函数示例 async def write_file(): await asyncio.sleep(2) print("文件写入完成") async def take_time(time): await asyncio.sleep(1.5) print(f"耗时任务完成,启动时间: {time}") async def start(): # 三个任务均通过create_task加入事件循环,异步并行执行 asyncio.create_task(write_file()) asyncio.create_task(say_hi()) # 改为create_task,移除await asyncio.create_task(take_time(time=datetime.now())) print("hi") # 此print会立即执行,无需等待上述任务完成 async def main(): tasks = [ start(), ] await asyncio.gather(*tasks) asyncio.run(main())
执行后输出顺序示例(顺序可能因调度略有不同):
hi HI 耗时任务完成,启动时间: [具体时间] 文件写入完成
内容的提问来源于stack exchange,提问作者Salivanch
相关产品推荐
相关产品推荐

