如果 XHR 获得 abort(),我如何终止长时间运行的 Django 请求?

Posted

技术标签:

【中文标题】如果 XHR 获得 abort(),我如何终止长时间运行的 Django 请求?【英文标题】:How do I terminate a long-running Django request if the XHR gets an abort()? 【发布时间】:2014-08-21 05:52:07 【问题描述】:

我在客户端发起请求,然后我改变主意并致电xhr.abort()

Django 对此有何反应?它会以某种方式终止线程吗?如果没有,我如何让 Django 停止浪费时间尝试响应中止的请求?如何优雅地处理?

【问题讨论】:

当调用.abort() 时,服务器通常会继续处理请求,它也会发送它,但客户端会忽略响应。我从来没有考虑过会发生什么,或者 Django 是否可以中止它自己的进程,但我认为不会。 我在想这样浪费服务器资源是一种耻辱...... 这取决于浏览器。如果浏览器关闭连接,服务器应该终止线程。 【参考方案1】:

由于 http 的工作方式以及您通常在 django gunicorn 应用程序进程(或 uswgi 等)前面有一个前端,您的 http 取消请求由 nginx 缓冲。 gunicorns 没有收到信号,它们只是完成处理,然后将任何内容输出到 http 套接字。但是,如果该套接字已关闭,则会出现错误(将其作为已关闭的连接捕获并移动一个)。

因此,如果您能找到一种方法来产生许多此类请求,那么对服务器进行 DOS 操作是很容易的。

但是要回答您的问题,这取决于后端,使用 gunicorn 它将继续运行直到超时。

【讨论】:

【参考方案2】:

只需将 Web 视为构建易于使用、分布式、松散耦合系统的平台,不能像 404 状态代码所暗示的那样保证资源的可用性。

我认为创建紧密耦合的解决方案(例如您的想法)违反了 Web 原则和 REST 的使用。 xhr.abort() 是客户端编程,它与服务器端完全不同。尝试将客户端技术收紧到服务器端内部行为是一种不好的做法。

这不仅浪费资源,而且Web服务器无法保证请求的处理状态。也可能导致数据不一致。

如果您的请求没有产生客户端无法处理的服务器端副作用 可以承担责任。最好忽略它,因为这类请求不会改变服务器状态,并且响应通常会被缓存以获得更好的性能。

如果您的请求可能会导致服务器状态或数据发生变化,为了数据的一致性,您可以使用 API 检查更改是否生效。如果有影响,请尝试使用其他 API 回滚。

【讨论】:

以上是关于如果 XHR 获得 abort(),我如何终止长时间运行的 Django 请求?的主要内容,如果未能解决你的问题,请参考以下文章

怎样终止HTTP请求

XHR对象的进度事件

当您没有 admin/root/sudo 访问权限时如何在 Netezza 上终止长时间运行的查询

终止jQuery的$.ajax方法abort

C# 线程运行完之后自己会不会释放掉

如何使 SET XACT_ABORT ON 回滚事务?