当前位置 : 主页 > 编程语言 > python >

Python Celery 任务执行有时成功有时失败(提示NotRegistered)

来源:互联网 收集:自由互联 发布时间:2022-06-18
环境:Centos 7.4 + Python3 + Flask + Redis ​问题场景​:同一任务,同样参数,任务创建后有时执行成功,有时执行失败 失败的错误如下: Celery配置信息如下: if os.getenv('REDIS_PASSWORD'): CEL

环境:Centos 7.4 + Python3 + Flask + Redis

​问题场景​:同一任务,同样参数,任务创建后有时执行成功,有时执行失败

失败的错误如下:

Python Celery 任务执行有时成功有时失败(提示NotRegistered)_redis

Celery 配置信息如下:

if os.getenv('REDIS_PASSWORD'):
CELERY_BROKER_URL = 'redis://:{}@redis:6379/2' . format(os.getenv('REDIS_PASSWORD'))
CELERY_RESULT_BACKEND = 'redis://:{}@redis:6379/2'.format(os.getenv('REDIS_PASSWORD'))
else:
CELERY_BROKER_URL = 'redis://redis:6379/2'
CELERY_RESULT_BACKEND = 'redis://redis:6379/2'

CELERYD_CONCURRENCY = 1 #并发worker数量
CELERY_TIMEZONE = 'Asia/Shanghai' #时区
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERYD_FORCE_EXECV = True #防止死锁,应确保为True
CELERYD_PREFETCH_MULTIPLIER = 1 #禁用任务预取
CELERYD_MAX_TASKS_PER_CHILD = 100 #worker执行100个任务自动销毁,防止内存泄露
CELERYD_TASK_SOFT_TIME_LIMIT = 6000 #单个任务的运行时间不超过此值(秒),否则会抛出(SoftTimeLimitExceeded)异常停止任务。
CELERY_DISABLE_RATE_LIMITS = True #即使任务设置了明确的速率限制,也禁用所有速率限制。

​问题产生原因:​因为开发中使用的redis服务是共享的,且有多个部署了Celery的服务使用此Redis,但存储时未做db切割,因此任务在生成时会出现被别的服务领走情况,因此造成任务执行的失败

​解决办法:​做redis的数据库分割,避免冲突

将Celery配置 redis://:{}@redis:6379/2 -> redis://:{}@redis:6379/3 即解决了此问题

网友评论