在Django应用和后台服务器中使用Celery

1 投票
1 回答
1044 浏览
提问于 2025-04-18 12:59

我有一个后续的问题,跟之前的一个老问题有关。

我现在有两台服务器。一台服务器运行着一个Django的网页应用,另一台服务器则运行一些纯Python脚本,这些脚本是定时任务,用来获取和处理网页应用的数据。

在某种情况下,当用户在网页应用中更新某个字段时,这个操作应该触发后端服务器的一系列动作。我可以继续使用定时任务(CRON),但随着业务的发展,我觉得可能会遇到麻烦。Celery看起来是个不错的解决方案,但我不太清楚该怎么实现。(是的,我看过入门指南)。

我希望网页应用能把任务发送到一个特定的队列,而后端服务器来实际执行这些工作。

假设两台服务器使用的是同一个消息代理的URL,

我需要在Django中定义一些空的任务吗,还是可以直接使用celery.send_task这个方法?我还需要继续使用django-celery吗?

同时,后端服务器会运行Celery,并完整实现这些任务和工作者吗?

1 个回答

1

我决定试试看,遇到问题再解决。

在我的 Django 服务器上,我没有使用 django-celery。我通过 pip 安装了 celeryredis,并按照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

另一台服务器上安装了 celeryredis(我使用了 AWS Elasticache 的 redis 实例进行测试)。这台服务器上有以下文件:

  • celeryconfig.py,里面定义了我所有的 Celery 配置和队列,指向与 Django 服务器相同的 BROKER_URL
  • tasks.py,里面有我所有任务的实际代码

然后在这台服务器上启动了 Celery 工作进程,使用的命令是:celery -A tasks worker -Q my-queue1,my-queue2

测试结果是这样的,上面的设置可以正常工作。现在我只需要让 Celery 在后台运行,并优化工作进程和队列的数量。

如果有人有其他建议或改进意见,我很乐意听取!

撰写回答