大模型async await 📅 2026/6/26 8:43:25 一、核心结论async和await不需要成对出现二者职责完全分开1.async只用来标记「异步函数」只要函数定义时写了async def这个函数就变成协程函数调用它会返回协程对象和里面有没有await无关。# 合法async函数内部无任何awaitasyncdeftest_no_await():print(我是异步函数但没用到await)return1232.await只能写在async def函数内部await是用来挂起等待可等待对象协程、Task、IO对象它不能单独出现在普通def函数里。规则有await的地方外层函数必须带async。二、四种常见场景拆解结合你截图里的代码举例场景1只有 async没有 await合法# async标记函数内部无await完全合规asyncdefmain():print(无await的异步函数)调用时依然需要asyncio.run(main())执行只是函数内部没有阻塞等待逻辑。场景2async await 成对出现最常用你的代码就是这类asyncdefmain():# result.stream_events() 是异步迭代器async for 底层封装了awaitasyncforeventinresult.stream_events():print(event)async for/async with本质是语法糖内部自动使用await等价于写了 await。如果手动写等待asyncdefmain():resawaitRunner.run_streamed(agent,inputxxx)场景3只有 await没有 async直接报错# 错误普通def函数里不能写awaitdefsync_func():awaitsomething报错SyntaxError: await outside function/await cant be used in a non-async function场景4多个 await 写在同一个 async 函数里完全允许asyncdefmulti_await():aawaittask1()bawaittask2(a)cawaittask3(b)returnc一个async函数里可以写任意数量await不存在一一对应关系。三、结合你截图代码单独解释asyncdefmain():# async标记这是异步协程函数resultRunner.run_streamed(agent,input讲一个故事至少300字)# async for 是异步迭代语法底层自动调用await获取流式事件asyncforeventinresult.stream_events():print(event)async def main()必须加async否则不能用async forasync for内部隐式包含await所以这里有隐式await末尾asyncio.run(main())是入口负责驱动协程运行。如果你把main里的流式循环删掉只保留简单逻辑依然是合法async函数asyncdefmain():print(纯异步函数内部无await/async for)四、一句话总结记忆async是函数修饰符定义异步函数有无await都能写await是等待关键字只能存在于async def内部一个async函数可包含N个await约束单向await必须依赖async但async不强制搭配await。