Python/Django AMQP?

3 投票
2 回答
2883 浏览
提问于 2025-04-16 12:27

我有一个用Django做的网页应用,它可以创建和保存工作任务到数据库里。每当有一个新任务时,我都需要发送邮件并把数据导出到另一个系统。我想把这个过程做成异步的,也就是不想让它阻塞其他操作。

那么,做这种任务的推荐方法是什么呢?

  • 首先,它必须可靠(如果服务意外停止,就不能漏掉任何任务)。
  • 其次,如果出现问题,应该有简单的方法来查看日志记录。
  • 我希望能轻松增加更多的工作者来处理这些任务。

  • 也许把任务队列放在同一个数据库表里会更好,这样我可以通过简单地改变数据库中的状态来取消任务?

  • 或许这个解决方案和Django框架有关系会更好?

2 个回答

1

我不确定这是不是你想要的,但我在我的Linux服务器上用定时任务(cron job)来处理这种事情,运行一个Python脚本。(在Windows上,相当于一个计划任务)

你可以通过调整sys.path列表来访问你项目中的模块和设置,方法如下:

import sys
import os
sys.path.append( PATH_TO_PROJECT_DIR )
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

这可能有点简单粗暴,因为你需要自己处理日志记录、任务队列等等,但对于一些简单的日常维护工作,比如发送邮件,这种方法效果很好,而且实现起来也很简单。

6

我建议你看看http://celeryproject.org/,在你的情况下,你可以使用https://github.com/ask/django-celery来简化和你现有应用的结合。其实在你的django项目中使用celery也应该是比较简单的。

Celery是一个可以让你在后台运行任务的工具,特别适合那些需要异步处理的任务。你可以有多个工作机器,并且可以动态添加工作者。整个系统是由RabbitMQ(www.rabbitmq.com)支持的,所以你的django应用会把任务放入队列,基本上就像这样:

from mycelerytasks import send_email

...

deferred_result = send_email.apply_async(*args, **kwargs)

如果你想等任务完成后再继续,可以使用deferred_result.wait(),但在你的情况下,你可能只想丢掉这个结果,让你的视图继续运行,这样用户就不用等着了。

撰写回答