Python使用async/await时出现'await' outside async报错如何解决
报错原因
- 直接触发报错的核心原因是:
await关键字只能在标注了async的异步函数内部使用,你代码里的内层函数sum_是普通同步函数,内部写了await sleep(),不符合async语法要求。 - 额外逻辑问题:
sum_直接引用外层循环的number变量、调用时传入了整个numbers列表而非当前遍历的单个数值,会导致计算结果不符合预期。
解决方案
你不需要把sleep调用拿到循环外,只要把内层sum_改为异步函数,调用时添加await即可,完全符合你的业务代码约束要求。
改动点如下:
- 给内层
sum_函数添加async前缀,声明为异步函数 - 调整
sum_入参为当前遍历的单个number值 - 循环调用
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
相关产品推荐
相关产品推荐

