在django视图中执行阻止请求

时间:2016-01-29 11:15:01

标签: python django celery

在我的django应用程序的一个视图中,我需要执行相对冗长的网络IO操作。问题是其他请求必须等待此请求完成,即使它们与它无关。 我做了一些研究并偶然发现了Celery,但据我了解,它用于执行独立于请求的后台任务。 (所以我不能使用任务的结果来响应请求)

有没有办法在django中异步处理视图,所以当网络请求待处理时,可以处理其他请求?

编辑:我忘了提到的是我的应用程序是使用django rest框架的Web服务。所以视图的结果是json响应而不是我以后可以使用AJAX修改的页面。

3 个答案:

答案 0 :(得分:2)

这里通常的解决方案是将任务卸载到芹菜上,并返回"请等待"在你看来回应。如果需要,您可以使用Ajax调用定期点击一个视图,该视图将报告响应是否准备就绪,并在响应时重定向。

答案 1 :(得分:0)

您希望长时间维护该HTTP连接,但仍允许管理其他请求,对吗?这个问题没有简单的解决方案。此外,任何解决方案都将远离Django,因为它取决于您处理请求的方式。

我不知道你目前正在使用什么,所以我只能告诉你我过去是如何处理的......我正在使用uwsgi来提供我的python应用程序和nginx之间的WSGI接口。在uwsgi中,当有时间等待IO连接时,我使用asynchronous functions暂停长时间运行的连接。这些方法允许您要求它暂停,直到有东西要读或写,然后允许其他连接被服务。

上述异步调用使用"绿色线程"。它比普通线程轻得多,你可以控制从线程移动到线程的时间。

答案 2 :(得分:-1)

我并不是说这是一个很好的解决方案[1],但简单的答案是使用以下模式:

delay

检查https://social.msdn.microsoft.com/Forums/vstudio/en-US/983b3b5b-7115-4821-b621-85b43578636e/how-can-i-end-a-datagrid-cell-edit-when-focus-switches-to-a-winforms-hosted-control?forum=wpf的文档。而不是使用{{1}}方法,您可以使用任何返回AsyncResult的方法(如get method

[1]为什么这可能是一个坏主意?持续等待很多连接对Django来说是不好的(它还没有为长期连接做好准备),可能与代理配置冲突(如果某处存在反向代理),并且可能被识别为来自浏览器的超时。所以...在Django Rest Framework视图中使用此模式似乎是一个坏主意[TM]。