Celery周期性任务作为Python的守护进程

时间:2012-08-30 07:37:06

标签: python celery

我想在Ubuntu实例上设置一个简单的python应用程序作为定期芹菜任务。我按照Celery文档按照建议设置了结构:

proj/__init__.py
/celery.py
/tasks.py

这很好用,我可以使用:

从../proj运行周期性任务
celery worker -B --app=proj

然后我复制了celeryd和celerybeat文件并编辑了默认文件。

然而,当我启动守护进程时,celeryd运行但似乎没有找到celery.py配置并记录连接被拒绝错误。

我认为它必须与以下路径相关:

#/etc/default/celeryd:

# Where to chdir at start.
CELERYD_CHDIR="/home/user/"

CELERY_CONFIG_MODULE="/home/user/proj"

除了更改CELERYD_USER之外,我已经离开了文档中指定的其他设置。

我觉得我应该在配置中使用--app并且可能指定我的python环境但是我不知道在哪里或如何(我没有运行虚拟环境)。

1 个答案:

答案 0 :(得分:0)

我现在正在努力解决同样的问题。这就是我的看法:

通信应用程序的两端执行执行任务的任务和工作程序。

工作人员不需要知道应用程序!对于工作人员来说,了解celeryconfig就足够了。您可以使用celery worker --config = mypackage.celeryconfig传递它。 worker将使用BROKER_URL连接到队列。记得在那里声明CELERY_IMPORTS,以便工人知道在哪里寻找任务定义。

客户端应用必须知道将请求发送到何处。因此,必须使用传递配置文件的方法之一传递相同的配置。我选了这个:

from __future__ import absolute_import

from celery import Celery
celery = Celery()
import backend.async.celeryconfig
celery.config_from_object(backend.async.celeryconfig)

当我在没有守护程序的情况下运行时,此设置对我有用,但由于某种原因,deamon会忽略我的CELERY_CONFIG_MODULE设置。


<强>更新

CELERY_CONFIG_MODULE未在/etc/init.d/celeryd脚本中使用

相反,我把它放在CELERYD_OPTS中,它就像一个魅力。:

CELERYD_OPTS="--config=backend.async.celeryconfig"

另一件事是在celeryd脚本中也忽略了VIRTUAL_ENV变量。在另一个celerybeat scirpt激活虚拟环境,所以我的建议配置是:

CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule --config=backend.async.celeryconfig"

VIRTUAL_ENV="/path/to/.virtualenvs/your_env"

# Python interpreter from environment.
ENV_PYTHON="$VIRTUAL_ENV/bin/python"

# How to call "celeryd-multi"
CELERYD_MULTI="$VIRTUAL_ENV/bin/celeryd-multi"

#CELERYD="$VIRTUAL_ENV/celeryd"

# How to call "celeryctl"
CELERYCTL="$VIRTUAL_ENV/bin/celeryctl"

# How to call "celerybeat"
CELERYBEAT="$VIRTUAL_ENV/bin/celerybeat"