Python异步方法加同步装饰器后返回None的问题排查与修复
问题根因
- 自定义的
async_loop装饰器的包装函数没有返回异步执行的结果:asyncio.loop.run_until_complete()方法执行协程时,会将协程函数的返回值作为自身的返回值回传,但你当前的decorated函数仅调用了该方法,没有将结果返回给调用方,因此外部调用tracking方法时只能拿到Python函数默认的返回值None。 - 额外存在资源泄漏隐患:
auth方法中重复创建了两次aiohttp.ClientSession实例,第一次创建的会话没有被主动关闭,程序退出时会触发资源警告。
修复方案
1. 修改装饰器逻辑,透传返回值
将async_loop装饰器调整为如下代码,新增return语句返回异步执行结果:
def async_loop(f): def decorated(self, *args, **kwargs): return self.loop.run_until_complete(f(self, *args, **kwargs)) return decorated
2. (可选)优化会话管理逻辑
新增析构方法主动关闭会话,避免资源泄漏:
class Yodel: # 原有代码保持不变 def __del__(self): if not self.session.closed: self.loop.run_until_complete(self.session.close())
修改完成后再次调用tracking方法即可拿到正确的查询结果列表。
内容的提问来源于stack exchange,提问作者Marcelo Gazzola
相关产品推荐
相关产品推荐

