Python分布式任务队列RQ 0.12.0与redis-py 3.0.0+不兼容问题如何解决
会遇到这个错误:
AttributeError: 'int' object has no attribute 'items'
今天在一台新机器上给 V2EX 构建开发环境的 Docker 镜像时发现的。解决方法是指定 redis-py 的版本:
redis==2.10.6
Python分布式任务队列RQ 0.12.0与redis-py 3.0.0+不兼容问题如何解决
2 回复
这个问题我遇到过,确实挺烦人的。RQ 0.12.0用的是redis-py 2.x的API,而redis-py 3.0.0做了不兼容的改动。
最简单的解决方案是降级redis-py:
pip install redis==2.10.6
或者升级RQ到支持redis-py 3.x的版本:
pip install rq>=1.0
如果你必须用redis-py 3.x和RQ 0.12.0,可以试试这个猴子补丁:
import redis
from redis import Redis
from rq.connections import Connection
# 修复redis-py 3.x的兼容性问题
class PatchedRedis(Redis):
def __init__(self, *args, **kwargs):
# 确保使用正确的连接池参数
kwargs.setdefault('decode_responses', False)
super().__init__(*args, **kwargs)
# 修复zrangebyscore方法
def zrangebyscore(self, name, min, max, start=None, num=None,
withscores=False, score_cast_func=float):
return super().zrangebyscore(name, min, max, start=start,
num=num, withscores=withscores,
score_cast_func=score_cast_func)
# 替换默认的Redis连接
Connection.redis_class = PatchedRedis
不过说实话,最好还是直接升级RQ到1.x版本,那个版本已经官方支持redis-py 3.x了。
版本兼容问题,升级或降级选一个就行。
celery4.0 和 redis-py3.0 也不兼容,推荐版本 redis==2.10.6

