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

Python 在Django中自动终止长时间运行的请求,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我已经安装了Apache+mod_wsgi,运行django代码,我想添加一层保护层,以防非终止视图滑入。如果某个请求超过,比如说,30秒,那么它就非常理想了 为了进行测试,我刚刚在视图中放置了一个time.sleep(60) 我在Apache中尝试了TimeOut 30设置,但60秒后仍然返回curl 我看到mod_wsgi本身提供了三种不同的超时值,但它们似乎都不适用于长时间运行的请求 是否有一个标准的Django中间件,或者Apache或mod_wsgi上是否缺少一个旋钮?在多线程应用程序

我已经安装了Apache+mod_wsgi,运行django代码,我想添加一层保护层,以防非终止视图滑入。如果某个请求超过,比如说,30秒,那么它就非常理想了

为了进行测试,我刚刚在视图中放置了一个
time.sleep(60)

我在Apache中尝试了
TimeOut 30
设置,但60秒后仍然返回curl

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


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

在多线程应用程序中终止单个Python请求线程实际上非常困难。您所能做的最好的决定是关闭整个进程并重新启动它。由于这样的操作将中断并发请求,因此您确实需要将自己限制为单线程配置

即使如此,mod_wsgi 3.X中的支持也不适合这种情况。守护进程模式有非活动超时,但它实际上会导致进程在两种情况下重新启动。第一种情况是根本没有请求,进程处于空闲状态。第二种情况是当所有请求线程都被阻塞并且超时过期时

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


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

谢谢。我们试图做的一件事是从5个进程(每个进程有20个请求线程)切换到100个进程(每个进程有一个请求线程)。我们希望mod_wsgi的超时可以停止进程,而不损害无关的请求。实际上,由于系统内存的原因(我本来希望有更多的共享内存),这是行不通的,但是如果非活动超时触发,mod_wsgi是否可能终止该进程?应用程序在fork之后加载,因此不会共享任何内容,这样写时拷贝将是一个好处。在Python中分叉之前预加载的好处并不像人们想象的那样多,因为代码执行会操纵引用计数,所以可以对大多数东西进行复制。mod_wsgi 4.0中的blocked timeout选项可能仍然是最好的选择。您仍然可以运行多线程,当所有线程都被卡住时,它将启动。但等到所有线程都卡住了也不好。因此,还有一个阻塞请求设置。如果线程数为15,则可以说阻塞的请求数为5。所以,一旦它有五个线程被卡住,并且到达了进程也没有处理请求的点,那么它将安全地重新启动。能够设置阻止的请求阈值可以为您提供一个安全裕度,这样流程就不会陷入停滞。