管理 Django 处理程序的线程

Posted

技术标签:

【中文标题】管理 Django 处理程序的线程【英文标题】:Managing Django handler's thread 【发布时间】:2017-01-23 07:27:37 【问题描述】:

它是产生/控制调用请求处理程序的线程(进程)的网络服务器吗?或者 Django 本身是否有任何异步/多线程架构?问题是当一个(ajax)请求被处理很长时间,并且在这个客户端再次重新发送它的过程中,前一个处理程序被终止。我想对此进行一些控制:例如执行一些清理操作。或者在某些情况下手动终止处理程序。

【问题讨论】:

【参考方案1】:

Django 不是一个网络服务器,它是一个网络框架,所以正如你所说,它产生线程来处理传入的请求,但网络服务器的工作是接受并最终响应 [http(s)] 的请求用户。

因此,您面临的可能是计算花费了太多时间,并且 Web 服务器(很可能是 nginx 或 apache)使请求超时。为了防止超时,您需要在您的网络服务器中增加超时设置。

另外,为了让 Django 工作,你需要一个理解 WSGI 的 connector,因为这个人大多使用 gunicornuwsgi em>、mod_wsgi 等等。您还需要将它们配置为接受更长的超时值。

例如,如果您使用的是 Nginx/Gunicorn,则可以参考 this question 了解如何设置超时。

最后,作为最后一点,如果您对请求进行大量计算,最好不要阻止用户的请求并在后台执行。在这种情况下,Celery 是一个非常方便的工具。

在您的情况下,如果计算量不是很大,您可以简单地增加超时值。但是,如果您的计算可能需要很长时间,例如 45 秒以上,最好改变您做事的方式并使用 celery 和后台处理请求来实现解决方案。

编辑。

如果您想知道究竟是谁在处理线程以及幕后发生了什么,我鼓励您阅读有关 Gunicorn 的 this posting,因为它可以很好地了解事物的工作原理。在阅读之前阅读design page of Gunicorn 本身也很好。基本上 WSGI 程序和 WebServer 都会在超时的情况下终止线程。

如果你的 django 线程更早超时(gunicorn 超时),那么 WSGI 程序会杀死线程。另一方面,如果 gunicorn 的超时设置高于 Nginx,Nginx 会杀死线程。

【讨论】:

感谢您的澄清。我的数据检索很长,我正在使用 Celery。但我仍然对这个问题感到好奇。谁从两个负责杀死一个线程? (我看到的是,当收到重复请求时,正在计算前一个请求)。我可以通过其他方式合法地影响此行为,然后更改服务器超时,或者我可以在需要时强制线程终止吗? @VladimirLenin 更新了我的答案。

以上是关于管理 Django 处理程序的线程的主要内容,如果未能解决你的问题,请参考以下文章

线程化的 Django 任务不会自动处理事务或数据库连接?

django 使用全局线程池

未调用 MFC 的 CWinThread::PostThreadMessage 处理程序

操作系統-進程管理4(線程)

C# 线程基础

Java 7 Concurrency Cookbook 翻译 第一章 线程管理之六