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



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

这是我的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

这是我的MySite的__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的项目结构。

我会发表评论,但没有50个声誉。

您有记录设置吗?如果是这样,请暂时禁用伐木并尝试重新开始芹菜。

当Django启动时,可能会出现错误的错误。在我的情况下,芹菜对日志文件没有正确的权限。

我遇到了同样的问题,但是由于我安全地解决了,所以我会做出回应。我的环境如下。

  • Django 4.0
  • 芹菜2.0

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

示例代码


使Django识别任务的要点如下。

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

  2. 启动工人和调度程序时,指定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
    

在这两个方面,django一侧应识别任务。请参阅示例代码以获取详细信息。

参考:

  • http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
  • https://github.com/celery/django-celery-beat

i使用django 2和芹菜4.1时遇到相同/一个相似的问题。看来AppConfig用芹菜弄乱了一些自动配置。我找到了两个解决方案:

  1. 不要将settings.INSTALLED_APPS传递给app.autodiscover_tasks功能。这可能会惹上其他事情,但还没有遇到过
  2. 确实将其传递给,但包括一个数组,其中只有在此处指出的应用程序名称的名称/li>

这是我的<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的设置与您的设置相同。

最新更新