Python Celery任务执行中,为何有时成功有时失败,出现NotRegistered错误?

2026-05-26 16:272阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计369个文字,预计阅读时间需要2分钟。

Python Celery任务执行中,为何有时成功有时失败,出现NotRegistered错误?

环境:CentOS 7.4 + Python3 + Flask + Redis问题场景:同一任务,相同参数,任务创建后有时执行成功,有时执行失败,失败错误如下:Celery配置信息如下:if os.getenv('REDIS_PASSWORD'): CELERY_RESULT_BACKEND='redis://:%s@localhost:6379/0' % os.getenv('REDIS_PASSWORD')

环境:Centos 7.4 + Python3 + Flask + Redis

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

失败的错误如下:

Celery配置信息如下:

Python Celery任务执行中,为何有时成功有时失败,出现NotRegistered错误?

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即解决了此问题

本文共计369个文字,预计阅读时间需要2分钟。

Python Celery任务执行中,为何有时成功有时失败,出现NotRegistered错误?

环境:CentOS 7.4 + Python3 + Flask + Redis问题场景:同一任务,相同参数,任务创建后有时执行成功,有时执行失败,失败错误如下:Celery配置信息如下:if os.getenv('REDIS_PASSWORD'): CELERY_RESULT_BACKEND='redis://:%s@localhost:6379/0' % os.getenv('REDIS_PASSWORD')

环境:Centos 7.4 + Python3 + Flask + Redis

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

失败的错误如下:

Celery配置信息如下:

Python Celery任务执行中,为何有时成功有时失败,出现NotRegistered错误?

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即解决了此问题