Celery-Django作为守护进程:未找到设置

时间:2014-07-11 07:38:31

标签: python django celery daemon

通过关注this tutorial,我现在有一个Celery-Django应用程序,如果我使用此命令启动worker,它可以正常工作: 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:编辑#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

5 个答案:

答案 0 :(得分:5)

这里的所有答案都可能是解决方案的一部分,但最后,它仍然无效。 但我终于成功地使它发挥作用。

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

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

由:

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

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

此外,我把它作为选项: CELERYD_OPTS =" - 应用程式= MyApp的"

并且不要忘记导出一些环境变量:

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

有了这一切,它现在正在我这边工作。

答案 1 :(得分:4)

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

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

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

export $PYTHONPATH:path/to/your/app

答案 2 :(得分:1)

下面的方法有助于运行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

答案 3 :(得分:1)

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

export DJANGO_SETTINGS_MODULE="settings"

这可能是为什么在更改目录时未找到您的设置的原因 &#34; /家庭/ ubuntu的/ MyApp的文件夹/&#34; 然后,您使用&#34; myapp&#34;定义了您的应用。然后你说设置在&#34; myapp.settings&#34;

这可能会导致它在

中搜索设置文件

&#34; /家庭/ ubuntu的/ MyApp的文件夹/ MyApp的/ MyApp的/设定&#34;

所以我的建议是删除&#34; myapp。&#34;在DJANGO_SETTINGS_MODULE变量中,不要忘记引号

答案 4 :(得分:0)

我想为任何最近遇到这个问题的人添加答案。

我遵循了Celery 4.4.7的三通的入门指南,以及没有运气的守护进程教程。

我最初的问题:

  • celery -A app_name worker -l info正常工作(芹菜配置正确)。
  • 我可以启动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(不是在CELERY_APP中指定为/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应用设置,请在{的末尾添加以下内容{1}}:

/etc/default/celeryd