2011-10-11 193 views
5

我已经设置了Apache + mod_wsgi运行django代码,并且我想添加一层保护以防非终止视图滑入。 - 超过30秒的请求将是理想的。在Django中自动终止长时间运行的请求

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

我试过了Apache的TimeOut 30设置,但我仍然在60秒后返回卷曲。

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

是否有一个标准的Django中间件为此或有一个旋钮我缺少Apache或mod_wsgi?

回答

6

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

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

在mod_wsgi 4.X(此时在版本库树干中),这两个概念已经分开,现在非活动超时仅适用于没有并发请求的完全空闲进程。新的阻塞超时已被添加到单独特定的超时时间,以阻止整个进程。这是你可以使用的后一个。

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

+0

谢谢。我们试图做的一件事是从5个进程(每个进程有20个请求线程)切换到100个进程(每个进程有一个请求线程)。希望是因为mod_wsgi的超时可能会终止进程而不会伤害无关的请求。在实践中,由于系统内存原因(我预料会有更多的共享内存)无法解决问题,但是如果不活动超时触发,mod_wsgi是否有可能会中止该进程? –

+0

应用程序在fork之后加载,因此没有共享任何内容,以便在写入时进行复制将是一项好处。在使用Python分叉之前进行预加载的好处并不像人们想象的那样多,因为代码执行会操纵引用计数,因此任何方式都会对大多数内容进行复制。 –

+0

mod_wsgi 4.0中的阻塞超时选项仍然可能是你最好的选择。您仍然可以运行多线程,并在所有线程都卡住时启动。等待所有线程卡住但不好。所以还有一个阻塞请求设置。如果你有线程= 15,你可以说阻塞请求= 5。所以,尽快它得到五个线程卡住和命中点没有任何请求被处理,然后它会安全地重新启动。能够设置阻止的请求阈值为您提供安全余量,因此流程不会停滞。 –