如何使用 Django 配置 Celery 守护进程

mli*_*ner 5 django virtualenv celery django-celery celeryd

据我所知,有两个文档描述了如何设置 celery。其中有“将工作线程作为守护进程运行”和“使用Django 的第一步”。

\n\n

在 Django 文档中,它说:

\n\n
\n

我们还添加 Django 设置模块作为 Celery 的配置源。这意味着您不必使用多个配置文件,而是直接从 Django 设置配置 Celery。

\n
\n\n

听起来棒极了。然而,据我所知,这些是完整的 Celery 守护进程所需的文件:

\n\n
    \n
  • /etc/init.d/celeryd
  • \n
  • /etc/defaults/celery
  • \n
  • /my-proj/celery.py
  • \n
  • /my-proj/__init__.py
  • \n
\n\n

并且可能:

\n\n
    \n
  • /my-proj/settings.py
  • \n
\n\n

天哪,文件太多了。我想我已经正确设置了它们:

\n\n
    \n
  • /etc/init.d/celeryd有celery 提供的默认 init.d 脚本。
  • \n
  • /etc/defaults/celery几乎什么都没有。只是指向我的应用程序的指针:

    \n\n
    export DJANGO_SETTINGS_MODULE=\'cl.settings\'\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • /my-proj/celery.py有Django 的第一步中推荐的文件:

    \n\n
    from __future__ import absolute_import\n\nimport os\n\nfrom celery import Celery\n\n# set the default Django settings module for the \'celery\' program.\nos.environ.setdefault(\'DJANGO_SETTINGS_MODULE\', \'proj.settings\')\n\nfrom django.conf import settings  # noqa\n\napp = Celery(\'proj\')\n\n# Using a string here means the worker will not have to\n# pickle the object when using Windows.\napp.config_from_object(\'django.conf:settings\')\napp.autodiscover_tasks(lambda: settings.INSTALLED_APPS)\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • /my-proj/__init__.py有Django 的第一步中的推荐代码:

    \n\n
    from __future__ import absolute_import\n\n# This will make sure the app is always imported when\n# Django starts so that shared_task will use this app.\nfrom .celery import app as celery_app\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

我的文件中有所有与芹菜相关的设置,如下所示settings.py

\n\n
CELERY_BIN = \'/var/www/.virtualenvs/my-env/bin/celery\'\nCELERYD_USER = \'www-data\'\nCELERYD_GROUP = \'www-data\'\nCELERYD_CONCURRENCY = 20\nBROKER_URL = \'redis://\'\nBROKER_POOL_LIMIT = 30\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,当我开始使用 celery 时sudo service celeryd start,它不起作用。相反,很明显它没有从我的 Django 项目中获取我的设置,因为它说:

\n\n
Nov 05 20:51:59 pounamu celeryd[30190]: celery init v10.1.\nNov 05 20:51:59 pounamu celeryd[30190]: Using config script: /etc/default/celeryd\nNov 05 20:51:59 pounamu celeryd[30190]: No passwd entry for user \'celery\'\nNov 05 20:51:59 pounamu su[30206]: No passwd entry for user \'celery\'\nNov 05 20:51:59 pounamu su[30206]: FAILED su for celery by root\nNov 05 20:51:59 pounamu su[30206]: - ??? root:celery\nNov 05 20:51:59 pounamu systemd[1]: celeryd.service: control process exited, code=exited status=1\n
Run Code Online (Sandbox Code Playgroud)\n\n

有什么想法是保水线不起作用吗?我错过了一些重要的事情吗?

\n

tuo*_*mur -1

你缺少CELERY_APP设置。将其设置在配置文件 /etc/defaults/celery中或作为worker命令的参数:

celery worker -A my-proj
Run Code Online (Sandbox Code Playgroud)

否则,Celery 不知道它应该看什么/my-proj/celery.py。django 环境变量不会影响 Celery 加载的内容。