下面是我的celery配制
BROKER_URL = 'amqp://cloud:wxy970928@localhost:5672//' # 连接rabbitmq
# CELERY_RESULT_BACKEND = "amqp://cloud:wxy970928@localhost:5672//cloud_res"
# BROKER_URL = 'redis://:wxy970928@localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://:wxy970928@localhost:6379/1'
CELERYD_CONCURRENCY = 30 # 并发worker数
CELERYD_FORCE_EXECV = True # 非常重要,有些情况下可以防止死锁
CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker最多执行100个任务就会被销毁,
如代码块所示,今天使用redis作为celery的存储结果时,一直出现错误,错误如下:
···
redis.exceptions.ResponseError: Command # 1 (SETEX b’celery-task-meta-734b07fc-944d-4416-a4c8-61834880f345’ b’\x80\x02}q\x00(X\x06\x00\x00\x00statu
sq\x01X\x07\x00\x00\x00SUCCESSq\x02X\x06\x00\x00\x00resultq\x03K\x06X\t\x00\x00\x00tracebackq\x04NX\x08\x00\x00\x00childrenq\x05]q\x06u.’ 86400) of
pipeline caused error: value is not an integer or out of range
···
这里意思是值超出范围,一开始没想到会是源码的问题,寻思着设置key value expire没什么问题,于是我试着将上述语句输入到redis里,报**Invalid argument(s)**这个错误,这才发现语句的顺序有问题,应该是key expire value。至此我点进这个错误里:
File "c:\python\python36\lib\site-packages\celery\backends\redis.py", line 172, in _set
pipe.execute()
这是管道提交时报的错,进去后是这样一段代码
这里只需将源码中的pipe.setex(key, value, self.expires)改为pipe.setex(key, self.expires,value)就可以了,重新启动celery,触发任务后再redis就可以看到键值了。