通过关注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
答案 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
正常工作(芹菜配置正确)。[2020-11-01 09:33:15,620: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
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