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

Python使用async/await时出现'await' outside async报错如何解决

报错原因
  • 直接触发报错的核心原因是:await关键字只能在标注了async的异步函数内部使用,你代码里的内层函数sum_是普通同步函数,内部写了await sleep(),不符合async语法要求。
  • 额外逻辑问题:sum_直接引用外层循环的number变量、调用时传入了整个numbers列表而非当前遍历的单个数值,会导致计算结果不符合预期。
解决方案

你不需要把sleep调用拿到循环外,只要把内层sum_改为异步函数,调用时添加await即可,完全符合你的业务代码约束要求。

改动点如下:

  1. 给内层sum_函数添加async前缀,声明为异步函数
  2. 调整sum_入参为当前遍历的单个number值
  3. 循环调用sum_时添加await关键字,触发异步调度

修正后可运行代码

import asyncio
import time

async def sleep():
    print(f'Time: {time.time() - start:.2f}')
    await asyncio.sleep(1)

async def sum(name, numbers):
    # 改为异步函数,入参改为当前遍历的单个number
    async def sum_(number):
        total = 0
        print(f'Task {name}: Computing {total}+{number}')
        await sleep()
        total += number
        print(f'Task {name}: Sum = {total}\n')

    for number in numbers:
        # 调用异步函数需要加await
        await sum_(number)

start = time.time()

loop = asyncio.get_event_loop()
tasks = [
    loop.create_task(sum("A", [1, 2])),
    loop.create_task(sum("B", [1, 2, 3])),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

end = time.time()
print(f'Time: {end-start:.2f} sec')

运行说明

修正后代码可以正常运行,总耗时约3秒,和最长的B任务执行时长一致,符合asyncio的并发调度逻辑。

内容的提问来源于stack exchange,提问作者teneji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:57:03