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


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


4322
2017-09-13 17:58


起源

重复: stackoverflow.com/questions/1352678/... - Daniel Roseman
我的坏,我以为我搜索得非常彻底!
不幸的是,看起来并不是一个简单的答案。


答案:


这个问题有几个解决方案,最好的解决方案取决于您的工作负载有多重。

如果您的工作负载较轻,则可以使用所使用的方法 Django的邮件 这是定义“作业”模型,将新作业保存到数据库中,然后让cron每隔一段时间运行一个独立脚本来处理存储在数据库中的作业(完成后删除它们)。你可以使用类似的东西 Django的计时码表 更轻松地管理作业调度

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

如果您的工作负载非常高,这意味着您需要多台服务器来处理作业,那么您希望使用真正的分布式任务队列。这里有很多比赛,所以我不能真正详细说明所有选项,但是用于Django应用程序的好选项是 芹菜


10
2017-09-14 04:10





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


1
2017-09-13 18:17





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

例如,如果每个用户的数据都相同,并且可以按计划运行,则可以使用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而且很简单,虽然最后一次提交是在4月,但似乎该项目已被放弃。 http://code.google.com/p/django-queue-service/

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

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


1
2017-09-14 11:34



是的,每个请求的结果完全不同。
Demiurge,在这种情况下,您需要查看此视图​​的请求频率。如果它将是一个很多,我建议一个队列解决方案。以这种方式,可以请求视图,将其添加到队列中,而无需用户等待它完成。 - ismail