未发现Celery 4.1.0和Django 2.0.2应用程序任务

时间:2018-02-27 22:17:25

标签: django celery

我找到了这个question并尝试了所有建议以及接受的答案。仍然没有运气。

这是我的mysite/taskapp/celery.py

import os
from celery import Celery
from django.apps import AppConfig
from django.conf import settings

if not settings.configured:
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings.local')  # pragma: no cover


app = Celery('mysite')


class CeleryConfig(AppConfig):
    name = 'mysite.taskapp'
    verbose_name = 'Celery Config'

    def ready(self):
        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))  # pragma: no cover

这是我的谜__init__.py

from mysite.taskapp.celery import app as celery_app

__all__ = ['celery_app']

以下是mysite/myapp/tasks.py示例:

from celery import shared_task

@shared_task
def mytask():
    print('Do something')

当使用celery -A mysite worker -l info运行芹菜工作者时,输出是

celery@tim-office v4.1.0 (latentcall)

Darwin-16.7.0-x86_64-i386-64bit 2018-02-27 21:38:55

[config]
.> app:         mysite:0x1058e0fd0
.> transport:   amqp://guest:**@localhost:5672//
.> results:     disabled://
.> concurrency: 4 (prefork)
.> task events: OFF (enable -E to monitor tasks in this worker)

[queues]
.> celery           exchange=celery(direct) key=celery


[tasks]
. mysite.taskapp.celery.debug_task

请注意,找不到mysite/myapp/tasks.py个任务。在设置文件中将应用添加到CELERY_IMPORTS,我一直在旋转轮子一整天尝试各种各样的事情:

CELERY_IMPORTS = ('myapp.tasks',)

试图强迫他们进入autodiscover_tasks line in the above mysite / taskapp / celery.py`:

app.autodiscover_tasks(['myapp',])

我在哪里错了?非常感谢任何帮助。

更新:可能值得注意的是我正在使用cookiecutter-django的项目结构。

3 个答案:

答案 0 :(得分:1)

我有同样的问题,但既然我安全地解决了它,我会回应。 我的环境如下。

  • Django 4.0
  • Celery 2.0

首先,我将向您展示示例代码。 (对不起,语言是日语。

Sample Code

让Django识别任务的要点如下:

  1. 为了让服务器识别任务,app.autodiscover_tasks ()仅在加载settings.py指定的DJANGO_SETTINGS_MODULE时被调用一次。它不需要在其他子应用程序上调用。

  2. 启动worker和scheduler时,请指定DJANGO_SETTINGS_MODULE

    # Server
    python3 manage.py runserver 0.0.0.0:8000
    
    # Worker
    DJANGO_SETTINGS_MODULE=tm.settings celery -A tm worker
    
    # Scheduler
    DJANGO_SETTINGS_MODULE=tm.settings celery -A tm beat --scheduler django_celery_beat.schedulers:DatabaseScheduler
    
  3. 有了这两个,Django方面应该认识到这个任务。有关详细信息,请参阅示例代码。

    参考文献:

答案 1 :(得分:0)

我会评论,但不会有50个声誉。

您是否有日志设置?如果是这样,暂时禁用日志记录并尝试再次启动芹菜。

当Django启动时,可能存在未被捕获的错误。在我的情况下,芹菜没有对日志文件的正确权限。

答案 2 :(得分:0)

使用Django 2和Celery 4.1时,我遇到了相同/类似的问题。似乎AppConfig混淆了Celery的一些自动配置。我找到了两个解决方案:

  1. 不要将settings.INSTALLED_APPS传递给app.autodiscover_tasks函数。这可能会使其他事情变得混乱,但还没有碰到它
  2. 请传入,但包含一个数组,其中只包含此处指出的应用名称https://stackoverflow.com/a/39129453/502572(看起来您提到了类似的方法作为评论)
  3. 这是我的<project_name>/<project_name>/celery.py文件:

    from __future__ import absolute_import, unicode_literals
    import os
    
    from celery import Celery
    
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', '<project_name>.settings')
    
    app = Celery('<project_name>')
    
    # Using a string here means the worker doesn't have to serialize
    # the configuration object to child processes.
    # - namespace='CELERY' means all celery-related configuration keys
    #   should have a `CELERY_` prefix.
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    # Load task modules from all registered Django app configs.
    app.autodiscover_tasks()
    
    if __name__ == '__main__':
        app.start()
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

    我的__init__.py<project_name>/<app_name>/tasks.py设置与您的相同。