关于 Celery 提示任务未注册的解决办法

问题描述

今天工作中碰到了这个问题。抽空记录一下。在用 celery.task 装饰器装饰了定时任务的方法后,启动 worker 进程在任务列表中找不到新增的任务。并且在执行任务时报错,信息如下:

[2018-05-31 15:57:52,340: INFO/MainProcess] celery@worker-00 ready.
[2018-05-31 15:57:52,343: ERROR/MainProcess] Received unregistered task of type 'tasks.reports.reports_data_collect'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you're using relative imports?

Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.

主要原因

经过分析主要原因是新增的定时任务没有加载至内存中。之前自己写的其他 Celery 任务没有出现这些问题是因为在某个地方导入并调用过。而这次新增的定时任务是写在新建的 .py 文件中,且没有在其他地方 import 过。所以任务在执行时会提示该任务未注册。

解决办法

在 Django 中只要在配置文件中加入以下参数即可解决。

# Celery
CELERY_IMPORTS = ('some.new.tasks')