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



我有一个带有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.pytasks.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))

相关内容

  • 没有找到相关文章

最新更新