You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动异步任务遇错误:如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:30:54