我有一个带有Celery 3.1的Django 1.7项目。Django项目中的所有应用程序都使用新的AppConfig。问题是并不是所有的任务都是用autodiscover_tasks
:找到的
app.autodiscover_tasks(settings.INSTALLED_APPS)
如果我像这样使用autodiscover_tasks,它会起作用:
app.autodiscover_tasks(settings.INSTALLED_APPS + ('apps.core','apps.sales'))
网站中定义的任务可以找到,但核心和销售中的任务却找不到。它们都具有与apps.py
和tasks.py
相同的布局。
项目文件夹结构为:
apps
core
apps.py
tasks.py
dashboard
apps.py
sales
apps.py
tasks.py
websites
apps.py
tasks.py
类别定义如下:
class WebsitesConfig(AppConfig):
name = 'apps.websites'
verbose_name = 'Websites'
class SalesConfig(AppConfig):
name = 'apps.sales'
verbose_name = 'Sales'
这在许多Celery问题中进行了讨论,如#2596和#2597。
如果你正在使用Celery 3.x,修复方法是使用:
from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()])
如#3341中所述,如果你正在使用Celery 4.x(即将发布),你可以使用:
app.autodiscover_tasks()
我刚刚遇到这个问题是因为配置错误的虚拟环境。
如果已安装的应用程序在运行芹菜的虚拟环境中缺少依赖项,则不会自动发现已安装应用程序的任务。当我从在同一台机器上运行web服务器和芹菜过渡到分布式解决方案时,这让我大吃一惊。错误的生成导致不同节点上的环境文件不同。
我添加了缺失的依赖项,然后重新启动了芹菜服务。
我不得不将其添加到定义芹菜应用程序的模块中:
from __future__ import absolute_import
我的问题是芹菜命令中celery.py
的路径错误。命令应该是这样的:
celery worker -A <project_name.celery_app_module> -l info
其中芹菜celery_app_module
是这样的:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# Set default Django settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project_name>.settings')
app = Celery('<project_name>', include=['<app_name>.tasks'])
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))