在Django应用和后台服务器中使用Celery
我有一个后续的问题,跟之前的一个老问题有关。
我现在有两台服务器。一台服务器运行着一个Django的网页应用,另一台服务器则运行一些纯Python脚本,这些脚本是定时任务,用来获取和处理网页应用的数据。
在某种情况下,当用户在网页应用中更新某个字段时,这个操作应该触发后端服务器的一系列动作。我可以继续使用定时任务(CRON),但随着业务的发展,我觉得可能会遇到麻烦。Celery看起来是个不错的解决方案,但我不太清楚该怎么实现。(是的,我看过入门指南)。
我希望网页应用能把任务发送到一个特定的队列,而后端服务器来实际执行这些工作。
假设两台服务器使用的是同一个消息代理的URL,
我需要在Django中定义一些空的任务吗,还是可以直接使用celery.send_task
这个方法?我还需要继续使用django-celery吗?
同时,后端服务器会运行Celery,并完整实现这些任务和工作者吗?
1 个回答
我决定试试看,遇到问题再解决。
在我的 Django 服务器上,我没有使用 django-celery
。我通过 pip 安装了 celery
和 redis
,并按照Django 的入门指南中的大部分步骤进行了操作:
- 更新了
proj/proj/settings.py
文件,添加了 Celery 所需的基本配置,比如BROKER_URL
- 创建了
proj/proj/celery.py
文件,但底部没有定义任务 - 按照文档更新了
proj/proj/__init__.py
文件 - 因为运行 Django 的服务器实际上不会执行任何 Celery 任务,所以在触发任务的视图中,我添加了以下代码:
from proj.celery import app as celery_app
try:
# 发送任务到 Celery 进行后台处理
celery_app.send_task('tasks.mytask', kwargs={'some_id':obj.id,'another_att':obj.att}, queue='my-queue')
except Exception as err:
print('发送任务到 Celery 时出现问题')
print err
另一台服务器上安装了 celery
和 redis
(我使用了 AWS Elasticache 的 redis 实例进行测试)。这台服务器上有以下文件:
celeryconfig.py
,里面定义了我所有的 Celery 配置和队列,指向与 Django 服务器相同的BROKER_URL
tasks.py
,里面有我所有任务的实际代码
然后在这台服务器上启动了 Celery 工作进程,使用的命令是:celery -A tasks worker -Q my-queue1,my-queue2
测试结果是这样的,上面的设置可以正常工作。现在我只需要让 Celery 在后台运行,并优化工作进程和队列的数量。
如果有人有其他建议或改进意见,我很乐意听取!