使用第三方API模块时遇asyncio TypeError:dict不可用于await表达式
解决异步调用同步API时的TypeError问题
嘿,我来帮你搞定这个报错!你遇到的TypeError: object dict can't be used in 'await' expression,核心原因很简单:await只能用于可等待对象(比如协程、Future、Task),而你调用的thirdPartyAPIwrapper.data()直接返回了一个字典(dict),它不是可等待对象,所以不能用await修饰。
再加上你代码里还有几个小拼写错误,我一起帮你修正并给出完整的解决方案:
第一步:修正代码里的低级错误
你的代码里有两处拼写问题:
asncio→ 正确拼写是asyncioretrienveData和retrieveData拼写不一致,要统一变量名
第二步:包装同步API为异步调用
因为第三方的data()是同步函数,直接在异步函数里调用会阻塞整个事件循环(这也是你之前应用卡顿的原因),我们可以用asyncio.run_in_executor()把同步调用放到线程池中执行,这样既不会阻塞事件循环,又能通过await等待结果返回。
修正后的完整代码
import asyncio import thirdPartyAPIwrapper async def getData(): # 获取当前事件循环 loop = asyncio.get_event_loop() # 把同步API调用放到线程池执行,返回可等待的Future对象 retrieveData = await loop.run_in_executor(None, thirdPartyAPIwrapper.data) return retrieveData def main(): # Python 3.7+推荐用asyncio.run()来运行异步函数 result = asyncio.run(getData()) print(result) if __name__ == "__main__": main()
为什么这样能解决问题?
run_in_executor()会把同步的thirdPartyAPIwrapper.data()调用放到单独的线程中执行,不会阻塞异步事件循环,彻底解决应用卡顿的问题;- 它返回的是一个
Future对象(可等待对象),所以可以用await来等待结果,自然就不会再触发TypeError了。
额外提示
如果这个第三方模块本身提供了异步版本的API(比如async_data()之类的),那优先使用官方的异步API,这样效率会更高;如果没有的话,上面的线程池包装方案就是最优解啦。
内容的提问来源于stack exchange,提问作者Riley Hughes
相关产品推荐
相关产品推荐

