如何在Django视图中最好地启动异步作业请求?

时间:2009-09-13 17:58:36

标签: django asynchronous

我的一个视图功能是一个非常长的处理工作,显然需要以不同的方式处理。 如果我能够通过电子邮件发送结果的处理作业,而不是等待完成通知用户他们的请求正在被处理并让他们浏览,而不是让用户等待很长时间。 我知道我可以使用os.fork,但我想知道Django是否有“正确的方法”。也许我可以返回HTTP响应,而不是以某种方式继续这项工作?

3 个答案:

答案 0 :(得分:10)

这个问题有几个解决方案,最好的解决方案取决于你的工作量有多大。

如果您有轻量级工作负载,您可以使用django-mailer使用的方法来定义“作业”模型,将新作业保存到数据库中,然后让cron每隔一段时间运行一个独立的脚本处理存储在数据库中的作业(完成后删除它们)。您可以使用django-chronograph之类的内容来更轻松地管理作业调度

如果您需要帮助了解如何编写脚本来处理工作,请参阅James Bennett的文章Standalone Django Scripts寻求帮助。

如果您的工作负载非常高,这意味着您需要多台服务器来处理这些作业,那么您需要使用真正的分发任务队列。这里有很多竞争,所以我无法详细说明所有选项,但是用于Django应用程序的好选项是celery

答案 1 :(得分:1)

为什么不简单地开始thread进行处理然后继续发送回复?

答案 2 :(得分:1)

在选择解决方案之前,您需要确定如何运行该流程。即每个用户都使用相同的流程,数据是否相同,是否可以定期安排?或者每个用户是否请求某些内容并且结果略有不同?

例如,如果每个用户的数据都相同,并且可以按计划运行,则可以使用cron。

请参阅:http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/ 要么 http://docs.djangoproject.com/en/dev/howto/custom-management-commands/

但是,如果请求是adhoc并且您需要一些可以处理高负载并且是异步的可扩展的:您实际需要的是消息排队系统。您的视图将向队列添加一个请求,然后该请求将被执行。

在Django中有几个选项可以实现: Django Queue服务纯粹是django& python和简单,虽然最后一次提交是在四月,似乎该项目已被放弃。 http://code.google.com/p/django-queue-service/

第二个选项,如果你需要扩展,分发并使用开源消息排队服务器:芹菜是你需要的

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree