管理 Django 处理程序的线程
Managing Django handler's thread
它是网络服务器 spawning/controlling 调用请求处理程序的线程(进程)吗?还是 Django 本身有 asynchronous/multithreaded 架构?问题是,当一个 (ajax) 请求被处理了很长时间,并且在此客户端再次重新发送它时,先前的处理程序被终止。我想对此进行一些控制:例如执行一些清理操作。或者在某些情况下手动终止处理程序。
Django 不是一个网络服务器,它是一个网络框架,所以正如你所说,它生成线程来处理传入的请求,但网络服务器的工作是接受并最终响应 [http(s)] 请求的用户。
所以您面临的可能是计算花费了太多时间,并且 Web 服务器(很可能是 nginx 或 apache)使请求超时。为了防止超时,您需要增加网络服务器中的超时设置。
同样为了让 Django 工作,你需要一个理解 WSGI 的 connector,因为人们大多使用 gunicorn, uwsgi, mod_wsgi等。您还需要将它们配置为接受更长的超时值。
例如,如果您使用 Nginx/Gunicorn,您可以参考 this question 了解如何设置超时。
最后,作为最后的说明,如果您对请求进行大量计算,最好不要阻止用户的请求并在后台执行。 Celery 在这种情况下是一个非常方便的工具。
对于您的情况,如果计算不是很大,您可以简单地增加超时值。但是如果您的计算可能需要很长时间,比如 45 秒以上,最好改变您做事的方式并使用 celery 和请求的后台处理来实现解决方案。
编辑。
如果您想知道究竟是谁在处理线程以及幕后发生了什么,我建议您在阅读之前阅读 this posting about Gunicorn since it's good insight on how things work. Also it's good to read on the design page of Gunicorn 本身。基本上 WSGI 程序和 WebServer 都会在超时的情况下终止线程。
如果你的 django 线程超时更快(gunicorn 超时),那么 WSGI 程序会终止线程。另一方面,如果 gunicorn 的超时设置高于 Nginx,Nginx 将终止线程。
它是网络服务器 spawning/controlling 调用请求处理程序的线程(进程)吗?还是 Django 本身有 asynchronous/multithreaded 架构?问题是,当一个 (ajax) 请求被处理了很长时间,并且在此客户端再次重新发送它时,先前的处理程序被终止。我想对此进行一些控制:例如执行一些清理操作。或者在某些情况下手动终止处理程序。
Django 不是一个网络服务器,它是一个网络框架,所以正如你所说,它生成线程来处理传入的请求,但网络服务器的工作是接受并最终响应 [http(s)] 请求的用户。
所以您面临的可能是计算花费了太多时间,并且 Web 服务器(很可能是 nginx 或 apache)使请求超时。为了防止超时,您需要增加网络服务器中的超时设置。
同样为了让 Django 工作,你需要一个理解 WSGI 的 connector,因为人们大多使用 gunicorn, uwsgi, mod_wsgi等。您还需要将它们配置为接受更长的超时值。
例如,如果您使用 Nginx/Gunicorn,您可以参考 this question 了解如何设置超时。
最后,作为最后的说明,如果您对请求进行大量计算,最好不要阻止用户的请求并在后台执行。 Celery 在这种情况下是一个非常方便的工具。
对于您的情况,如果计算不是很大,您可以简单地增加超时值。但是如果您的计算可能需要很长时间,比如 45 秒以上,最好改变您做事的方式并使用 celery 和请求的后台处理来实现解决方案。
编辑。
如果您想知道究竟是谁在处理线程以及幕后发生了什么,我建议您在阅读之前阅读 this posting about Gunicorn since it's good insight on how things work. Also it's good to read on the design page of Gunicorn 本身。基本上 WSGI 程序和 WebServer 都会在超时的情况下终止线程。
如果你的 django 线程超时更快(gunicorn 超时),那么 WSGI 程序会终止线程。另一方面,如果 gunicorn 的超时设置高于 Nginx,Nginx 将终止线程。