Skip to main content
 首页 » 编程设计

python之Celery Periodic Task 作为 Python 的守护进程

2025年05月04日10findumars

我想在 Ubuntu 实例上设置一个简单的 python 应用程序作为周期性的 celery 任务。我已按照 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 环境,但我不确定在哪里或如何(我没有运行虚拟环境)。

请您参考如下方法:

我现在也在为同样的事情苦苦挣扎。这是我的看法:

有执行任务的通信应用和执行任务的worker两端。

Worker 不需要知道 app! 对于 worker 部分,知道 celeryconfig 就足够了。您可以使用 celery worker --config=mypackage.celeryconfig 传递它。工作人员将使用 BROKER_URL 连接到队列。请记住在那里声明 CELERY_IMPORTS,这样 worker 就会知道在哪里寻找任务定义。

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

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

当我在没有 deamon 的情况下运行时,这个设置对我有用,但由于某种原因,deamon 忽略了我的 CELERY_CONFIG_MODULE 设置。


更新:

CELERY_CONFIG_MODULE 没有在/etc/init.d/celeryd 脚本的任何地方使用!

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

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

另一件事是 VIRTUAL_ENV 变量在 celeryd 脚本中也被忽略了。另一方面,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"