【问题标题】:Celery-Django as Daemon: Settings not foundCelery-Django 作为守护进程:未找到设置
【发布时间】:2014-09-01 18:24:32
【问题描述】:

通过关注this tutorial,我现在有了一个 Celery-Django 应用程序,如果我使用以下命令启动工作程序,它就可以正常工作: celery -A myapp worker -n worker1.%h

在我的 Django settings.py 中,我为 Celery 设置了所有参数(消息代理的 IP 等...)。一切正常。

我现在的下一步是将这个应用程序作为守护程序运行。所以我关注了this second tutorial,一切都很简单,除了现在,我的settings.py中包含的Celery参数没有加载。例如,消息代理 IP 设置为 127.0.0.1,但在我的 settings.py 中,我将其设置为其他 IP 地址。

在教程中,他们说:

确保定义 Celery 应用实例的模块也为 DJANGO_SETTINGS_MODULE 设置默认值,如 First steps with Django 中的示例 Django 项目所示。

所以我确定了。我在 /etc/default/celeryd 这个:

导出 DJANGO_SETTINGS_MODULE="myapp.settings"

仍然无法正常工作......所以我也在 /etc/init.d/celeryd 中有这一行,再次无法正常工作。 我不知道该怎么办了。有人有线索吗?

编辑: 这是我的 celery.py:

from __future__ import absolute_import

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

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

app = Celery('myapp')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


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

编辑#2: 这是我的 /etc/default/celeryd:

# Names of nodes to start
#   most will only start one node:
CELERYD_NODES="worker1.%h"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="myapp"

# Where to chdir at start.
CELERYD_CHDIR="/home/ubuntu/myapp-folder/"

# Extra command-line arguments to the worker
CELERYD_OPTS=""

# %N will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"

# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists, e.g. nobody).
CELERYD_USER="ubuntu"
CELERYD_GROUP="ubuntu"

# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1

# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE=myapp.settings
export PYTHONPATH=$PYTHONPATH:/home/ubuntu/myapp-folder

【问题讨论】:

  • 你的 celery.py 文件是什么样子的?
  • 你可以在我的第一篇文章中看到 celery.py。你有什么想法吗?
  • 你在 /etc/default/celeryd 中有这行 [CELERYD_CHDIR="/some_dir/myapp/"] 吗?
  • 我已经有好几年没有尝试配置 Celery 了。我真的希望它变得更好,但看起来它和往常一样可怕。

标签: python django celery daemon


【解决方案1】:

这里的所有答案都可能是解决方案的一部分,但最后仍然无法正常工作。 但我终于成功地让它工作了。

首先,在/etc/init.d/celeryd,我改变了这一行:

CELERYD_MULTI=${CELERYD_MULTI:-"celeryd-multi"}

作者:

CELERYD_MULTI=${CELERYD_MULTI:-"celery multi"}

第一个被标记为已弃用,可能是问题。

此外,我将此作为选项: CELERYD_OPTS="--app=myapp"

别忘了导出一些环境变量:

# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="myapp.settings"
export PYTHONPATH="$PYTHONPATH:/home/ubuntu/myapp-folder"

有了这一切,它现在就在我身边。

【讨论】:

    【解决方案2】:

    问题很可能是celeryd 找不到您的Django 设置文件,因为myapp.settings 不在$PYTHONPATH 中,然后应用程序运行。

    据我回忆,Python 在导入文件时会查看$PYTHONPATH 以及本地文件夹。当celeryd 运行时,它可能会检查模块app 的路径,但没有找到它,然后在当前文件夹中查找带有__init__.py 的文件夹app(即python 模块)。

    我认为您需要做的就是将其添加到您的 /etc/default/celeryd 文件中:

    export $PYTHONPATH:path/to/your/app
    

    【讨论】:

      【解决方案3】:

      以下方法有助于运行 celeryd,而是有助于将 celery worker 作为服务运行,该服务将在启动时启动。

      sudo service celery status 这样的命令也可以使用。

      celery.conf

      # This file sits in /etc/init
      description "Celery for example"
      start on runlevel [2345]
      stop on runlevel [!2345]
      #Send KILL after 10 seconds
      kill timeout 10
      
      script
      
      #project(working_ecm) and Vitrualenv(working_ecm/env) settings
      chdir /home/hemanth/working_ecm
      exec /home/hemanth/working_ecm/env/bin/python manage.py celery worker -B -c 2 -f /var/log/celery-ecm.log --loglevel=info >> /tmp/upstart-celery-job.log 2>&1
      end script
      
      respawn
      

      【讨论】:

      • 为什么我做了service celeryd stop,然后service celeryd status,它说我的worker还在运行?
      • 它可能与您安装的软件包不同。确认尝试将 /etc/init/celery.conf 重命名为 /etc/init/testxyz.conf ...并尝试 [sudo service testxyz start]。
      【解决方案4】:

      在您的第二个教程中,他们将 django_settings 变量设置为:

      export DJANGO_SETTINGS_MODULE="settings"
      

      这可能是您的设置在更改为目录时找不到的原因 “/home/ubuntu/myapp-文件夹/” 然后你用“myapp”定义了你的应用,然后你说设置在“myapp.settings”中

      这可能导致它在

      中搜索设置文件

      "/home/ubuntu/myapp-folder/myapp/myapp/settings"

      所以我的建议是删除“myapp”。在 DJANGO_SETTINGS_MODULE 变量中,不要忘记引号

      【讨论】:

        【解决方案5】:

        我想为最近遇到此问题的人添加一个答案。

        我按照入门的第一步指南使用了 Celery 4.4.7 以及 Daemonization 教程,但没有运气。

        我最初的问题:

        • celery -A app_name worker -l info 正常工作(实际 celery 配置正常)。
        • 我可以将 celeryd 作为守护进程启动,并且状态命令会显示 OK,但无法接收任务。检查日志,我看到以下内容: [2020-11-01 09:33:15,620: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
        • 这表明 celeryd 没有连接到我的代理 (redis)。鉴于 CELERY_BROKER_URL 已经在我的配置中设置,这意味着我的 celery 应用程序设置没有被拉入守护进程。
        • 我尝试sudo C_FAKEFORK=1 sh -x -l -E /etc/init.d/celeryd start 来查看是否有任何 我的芹菜设置被拉入,我注意到app 被设置为默认default(不是指定为@987654326 的应用程序名称@在/etc/default/celeryd

        由于celery -A app_name worker -l info 有效,通过在/etc/default/celeryd/ 中导出 CELERY_APP 解决了这个问题,而不是仅仅为每个文档设置变量。

        TL;DR 如果 celery -A app_name worker -l info 有效(将 app_name 替换为您在 Celery 第一步指南中定义的内容),并且 sudo C_FAKEFORK=1 sh -x -l -E /etc/init.d/celeryd start 没有显示您的 celery 应用程序设置被拉入,请将以下内容添加到您的 /etc/default/celeryd 末尾:

        export CELERY_APP="app_name"

        【讨论】:

          猜你喜欢
          • 2013-05-29
          • 2016-10-07
          • 2018-03-06
          • 2014-11-24
          • 2018-06-11
          • 2016-02-07
          • 2013-06-14
          • 2017-06-11
          • 1970-01-01
          相关资源
          最近更新 更多