Python/Django AMQP?
我有一个用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()
,但在你的情况下,你可能只想丢掉这个结果,让你的视图继续运行,这样用户就不用等着了。