芹菜4不能自动发现任务

时间:2017-10-31 20:05:29

标签: python django celery

我有一个Django 1.11和Celery 4.1项目,我根据setup docs配置了它。我的celery_init.py看起来像

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings.settings'

app = Celery('myproject')

app.config_from_object('django.conf:settings', namespace='CELERY')

#app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) # does nothing
app.autodiscover_tasks() # also does nothing

print('Registering debug task...')
@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

然而,当我用:

启动一名工人时
.env/bin/celery worker -A myproject -l info

它显示除了示例“debug_task”之外没有找到任何任务,即使我有几个已安装的应用程序与Celery任务,应该通过调用app.autodiscover_task()找到。这是我的工作人员生成的初始输出:

 -------------- celery@localhost v4.1.0 (latentcall)
---- **** ----- 
--- * ***  * -- Linux-4.13.0-16-generic-x86_64-with-Ubuntu-16.04-xenial 2017-10-31 15:56:42
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         myproject:0x7f952856d650
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     amqp://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . myproject.celery_init.debug_task

[2017-10-31 15:56:42,180: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-10-31 15:56:42,188: INFO/MainProcess] mingle: searching for neighbors
[2017-10-31 15:56:43,211: INFO/MainProcess] mingle: all alone
[2017-10-31 15:56:43,237: INFO/MainProcess] celery@localhost ready.

我的应用tasks.py文件中的所有遗留任务都定义如下:

from celery.task import task

@task(name='mytask')
def mytask():
    blah

文档建议使用shared_task装饰器,所以我尝试了:

from celery import shared_task

@shared_task
def mytask():
    blah

但我的芹菜工人仍然没有看到它。我做错了什么?

编辑:我已经能够通过在我的设置CELERY_IMPORTS列表中明确列出任务来显示任务,但即使这样,我也必须大量编辑tasks.py以删除我的所有导入Django项目(models.py等)或它引发异常Apps aren't loaded yet.这比没有好,但需要大量的重构。还有更好的方法吗?

6 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,解决方案是将include kwarg添加到您的芹菜电话中。

  

include参数是工作程序启动时要导入的模块列表。您需要在此处添加我们的任务模块,以便工作人员能够找到我们的任务。

app = Celery('myproject', 
             backend = settings.CELERY.get('backend'),
             broker = settings.CELERY.get('broker'),
             include = ['ingest.tasks.web', ... ])

查看http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#proj-celery-py了解详情

答案 1 :(得分:2)

只是在这里张贴(我不知道它为什么会起作用)

from django.conf import settings

app.config_from_object(settings, namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS, force=True)

force=True似乎是解决方案

另一件可行的方法是在实例化芹菜之前调用django.setup()

from __future__ import absolute_import, unicode_literals
import os

import django

from celery import Celery


django.setup()  # This is key


# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('notifs')
app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

此方法避免了force=True,导入django.conf.settings并且对我来说似乎更清晰。虽然我仍然不知道为什么你需要致电django.setup,因为它没有在文档中说明。

答案 2 :(得分:0)

from django.conf import settings    
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

您可以添加以上行以使芹菜自动发现在整个项目中编写的所有任务。这对我有用。

答案 3 :(得分:0)

我发现更大的问题是Celery没有将我的自定义Row 3实例设置为当前应用。要修复它,我必须修改我的Celery()以包含:

celery_init.py

答案 4 :(得分:0)

接受的答案对我不起作用。我正在使用芹菜4.1.0和django 2.0.2,同样的事情发生在我身上......它显示除了示例" debug_task"之外没有找到任何任务,即使我有几个已安装Celery的应用程序应该通过调用app.autodiscover_task()找到任务。

我已尝试手动将其添加到CELERY_IMPORTS,并尝试了上述建议。同样的结果。经过几个小时没有运气。

答案 5 :(得分:0)

即使我不确定,是否行得通。但是我想它对我有用:

在您提到的同一documentation中有一个部分:

enter image description here

此后,我删除了CELERY_IMPORTS,它可以从项目中所有应用程序中注册任务