aioredis 2.0.0运行旧代码提示无create_redis属性如何解决
问题原因
你参考的是aioredis 1.x版本的旧用法,你当前安装的aioredis 2.0.0是大版本更新,做了大量不向下兼容的API改动:
- 废弃了原来的
create_redis初始化接口,改用aioredis.from_url等方法初始化客户端 - pub/sub的实现逻辑完全重构,取消了原来的channel对象、
wait_message、publish_json等专属方法 - 底层API对齐了官方redis-py的接口风格,旧版本的示例代码完全无法直接在2.x上运行
解决方案
提供两种可选方案:
方案1:降级aioredis到1.x兼容旧代码
直接执行命令安装1.x的最终稳定版即可:
pip install aioredis==1.3.1
安装完成后你当前的代码无需任何修改即可正常运行。
方案2:修改代码适配aioredis 2.x版本
适配后的完整代码如下:
import asyncio import aioredis from aioredis.client import PubSub async def reader(pubsub: PubSub): while True: msg = await pubsub.get_message(ignore_subscribe_messages=True) if msg is not None: print("Got Message:", msg["data"]) async def main(): # 初始化客户端,无需await pub = aioredis.from_url('redis://:password@localhost:6379') sub = aioredis.from_url('redis://:password@localhost:6379') # 初始化pubsub对象并订阅频道 pubsub = sub.pubsub() await pubsub.subscribe("chan:1") tsk = asyncio.ensure_future(reader(pubsub)) # 发布消息,2.x没有publish_json,需要自行序列化json后传入 await pub.publish("chan:1", '["Hello", "world"]') # 等待保证消息消费完成 await asyncio.sleep(1) # 取消订阅、关闭任务和连接 await pubsub.unsubscribe("chan:1") tsk.cancel() await pub.close() await sub.close() if __name__ == '__main__': loop = asyncio.get_event_loop() result = loop.run_until_complete(main())
内容的提问来源于stack exchange,提问作者Saligia
相关产品推荐
相关产品推荐

