Django自动终止长时间运行的请求
我这边有一个用Apache和mod_wsgi运行Django代码的环境,我想加一层保护,以防止出现一些不会结束的视图。比如说,如果请求超过30秒就自动终止,那就太好了。
为了测试,我在一个视图里放了一个time.sleep(60)
,让它暂停60秒。
我试过在Apache里设置TimeOut 30
,但是我还是发现curl在60秒后才返回结果。
我看到mod_wsgi本身提供了三种不同的超时设置,但似乎都不适用于那些运行时间很长的请求。
请问Django有没有标准的中间件可以解决这个问题,或者我在Apache或mod_wsgi上有没有漏掉什么设置呢?
1 个回答
6
在一个多线程的应用程序中,结束一个单独的Python请求线程其实是非常困难的。你能做的最好的选择就是决定关闭整个进程,然后重新启动它。因为这样会影响到同时进行的请求,所以你可能需要限制自己只使用单线程的配置。
即便如此,mod_wsgi 3.X对这个问题的支持也不是很好。在守护进程模式下有一个不活动超时设置,但它实际上会在两种情况下导致进程重启。第一种情况是当没有任何请求时,进程处于空闲状态。第二种情况是当所有请求线程都被阻塞,超时到期。
在mod_wsgi 4.X(目前的开发版本)中,这两个概念已经被分开,现在不活动超时只适用于完全空闲且没有并发请求的进程。还新增了一个阻塞超时,用于单独指定整个进程被阻塞时的超时时间。你可以使用后者。
如果你想了解更多关于这个新选项的信息,你需要去mod_wsgi的邮件列表讨论一下。