在Django中自动终止长时间运行的请求

时间:2011-10-11 17:50:26

标签: python django apache mod-wsgi

我已经使用运行django代码的Apache + mod_wsgi进行了设置,并且我想添加一层保护,以防非终止视图滑入。有些东西可以杀死超过30的请求。秒是理想的。

为了进行测试,我只是在视图中添加了time.sleep(60)

我在Apache中尝试过TimeOut 30设置,但60秒后仍然会恢复卷曲。

我看到mod_wsgi本身提供了三种不同的超时值,但它们似乎都不适用于长时间运行的请求。

是否有一个标准的Django中间件,或者我在Apache或mod_wsgi上缺少一个旋钮?

1 个答案:

答案 0 :(得分:6)

在多线程应用程序中终止单个Python请求线程实际上非常困难。您可以做的最好的事情是决定关闭整个过程并重新启动它。因为这样的操作会破坏并发请求,所以你真的需要将自己局限于单线程配置。

即便如此,mod_wsgi 3.X中的支持对此并不理想。守护进程模式存在不活动超时,但实际上会导致进程在两种情况下重新启动。第一种是根本没有请求,进程空闲。第二种是当所有请求线程都被阻塞并且超时到期时。

在mod_wsgi 4.X中(此时在存储库中继中),这两个概念已经分离,现在不活动超时仅适用于没有并发请求的完全空闲进程。添加了一个新的阻塞超时,以便在整个进程被阻止时单独指定特定的超时。你可以使用后者。

如果您想了解有关新选项的更多信息,您需要转到mod_wsgi邮件列表进行讨论。