它是一个产生/控制调用请求处理程序的线程(进程)的Web服务器吗?或者Django本身是否有任何异步/多线程架构?问题是,当一个(ajax)请求被处理很长时间,并且在此客户端再次重新发送它时,前一个处理程序将被终止。我希望对此有一些控制权:例如执行一些清理操作。或者在某些情况下手动终止处理程序。
答案 0 :(得分:2)
Django不是一个Web服务器,它是一个Web框架,所以确实如你所说,它产生了处理传入请求的线程,但是Web服务器的工作是接受并最终响应[http(s)]的请求。用户。
所以你面临的可能是计算需要花费太多时间而且web服务器(很可能是nginx或apache)会超时请求。为了防止超时,您需要增加Web服务器中的超时设置。
另外为了让Django工作,你需要一个理解WSGI的连接器,因为这个人大多使用 gunicorn , uwsgi , mod_wsgi 等等。您还需要将它们配置为接受更长的值以进行超时。
例如,如果你使用的是Nginx / Gunicorn,你可以参考this question来了解如何设置超时。
最后,作为最后一点,如果您对请求进行大量计算,最好不要阻止用户的请求并在后台执行。在这种情况下,Celery是一个非常方便的工具。
在您的情况下,如果它不是一个巨大的计算,您可以简单地增加超时值。但是如果您的计算可能需要很长时间,比如45秒,那么最好改变您的工作方式并使用芹菜和后台处理请求来实现解决方案。
编辑。
如果您想知道究竟是谁处理线程以及幕后发生了什么,我建议您阅读this posting关于Gunicorn的信息,因为它可以很好地了解事情是如何运作的。在阅读之前阅读design page of Gunicorn本身也是一件好事。基本上,WSGI程序和WebServer都会在超时的情况下终止线程。
如果你的django线程超时(gunicorn超时),则WSGI程序会杀死该线程。另一方面,如果将gunicorn的超时设置为高于Nginx,则Nginx会终止该线程。