Celery autodiscover_tasks 不适用于所有 Django 1.7 应用程序

Celery autodiscover_tasks not working for all Django 1.7 apps

我有一个 Django 1.7 项目和 Celery 3.1。我的 Django 项目中的所有应用程序都使用新的 AppConfig。问题是不是所有的任务都用 autodiscover_tasks:

找到
app.autodiscover_tasks(settings.INSTALLED_APPS)

如果我像这样使用 autodiscover_tasks 它将起作用:

app.autodiscover_tasks(settings.INSTALLED_APPS + ('apps.core','apps.sales'))

找到网站定义的任务,但找不到核心和销售中的任务。 apps.pytasks.py 都具有相同的布局。

项目文件夹结构为:

apps
  core
  apps.py
  tasks.py
dashboard
  apps.py
sales
  apps.py
  tasks.py
websites
  apps.py
  tasks.py

class定义如下:

class WebsitesConfig(AppConfig):
    name = 'apps.websites'
    verbose_name = 'Websites'

class SalesConfig(AppConfig):
    name = 'apps.sales'
    verbose_name = 'Sales'

这在许多 Celery 问题中都有讨论,例如 #2596 and #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()

我必须将它添加到定义我的 celery 应用程序的模块中:

from __future__ import absolute_import

由于虚拟环境配置错误,我刚刚遇到了这个问题。

如果已安装的应用程序在您 运行 celery 所在的虚拟环境中缺少依赖项,则不会自动发现已安装应用程序的任务。当我从同一台机器上的 运行 我的网络服务器和芹菜转移到分布式解决方案时,这让我很震惊。错误的构建导致不同节点上的不同环境文件。

我添加了缺少的依赖项,然后重新启动了 celery 服务。

我的问题是 celery 命令中 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))