我在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'
答案 0 :(得分:19)
如果您使用的是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()
答案 1 :(得分:2)
由于虚拟环境配置错误,我遇到了这个问题。
如果已安装的应用程序在您运行芹菜的虚拟环境中缺少依赖关系,则不会自动发现已安装应用程序的任务。当我从在同一台机器上运行我的Web服务器和芹菜到分布式解决方案时,这让我感到震惊。错误的构建导致不同节点上的不同环境文件。
我添加了缺少的依赖项,然后重新启动了芹菜服务。
答案 2 :(得分:0)
我必须将其添加到定义我的芹菜应用程序的模块中:
from __future__ import absolute_import
答案 3 :(得分:0)
我的问题是在celery命令中通往@Bean
@RequestScope
public Supplier<String> auditIdSupplier() {
String val = String.join("-","KEY",UUID.randomUUID().toString());
return () -> val;
}
的路径错误。
该命令应该是这样的:
celery.py
芹菜celery worker -A <project_name.celery_app_module> -l info
像这样:
celery_app_module