【问题标题】:How does Django handle multiple requests?Django 如何处理多个请求?
【发布时间】:2018-08-19 04:46:48
【问题描述】:

Django如何处理生产环境中的多个请求?

假设我们有一个 Web 服务器:Apache、Nginx、gunicorn 等。
那么那些来自网络浏览器的任何请求的服务器是否会启动新的进程来处理该请求?
如果是真的,会不会造成巨大的开销?
如果不是这样,那么同一个视图(假设它是绑定到/hello url 的def hello(request) 视图)如何同时服务多个请求。

我已经看到问题“...处理多个用户”的答案

【问题讨论】:

  • 您是否处于可以访问命令行以便查看 apache 日志、ps 等的 unix 环境中?如果是这样,您可以运行此命令来查看请求和 http 流量进程:$ watch "ps aux | grep http "。如您所见,请求是通过单独的流程提供的。只有当工作是 CPU、内存或 IO 密集型时,它才会导致巨大的负载。
  • 是的,但是这个问题仍然是理论上的。例如,由于使用 DB,IO 可能会非常密集
  • 关于 Python 中的 Web 服务器是如何工作的,您可能会发现阅读本系列文章会很有趣。 ruslanspivak.com/lsbaws-part1
  • 这是特定于 Apache/mod_wsgi 的,但在 WSGI 服务器中使用进程和线程时阅读它也可能会很有趣。 modwsgi.readthedocs.io/en/develop/user-guides/…

标签: python django wsgi


【解决方案1】:

Django 一次只处理一个请求。

如果您使用非常旧的 CGI 接口(在您的网络服务器和 Django 之间),则每次请求都会启动一个新的 Django 进程。但我认为没有人这样做。

Web 服务器上有许多额外的接口,并不是在每次请求时都加载一个新的服务器端程序。 FastCGI 就是其中之一(与编程语言无关),一些程序有自己的模块直接在 Web 服务器中实现(例如 mod-php)[python 过去有这个]。但是现在 Django 和一般的 python,更喜欢 WSGI 接口。

所以网络服务器并行打开一个或多个程序(Django 应用程序)。 Web 服务器将请求发送到一个空闲进程(或者它排队请求,这由 Web 服务器处理)。有多少进程,持续多长时间,取决于网络服务器配置。

django支持的数据库支持并发,所以不同进程处理同一个应用是没有问题的。 [SQLite 不同,但您应该使用它,仅用于开发/测试 Django]。通过写入一些日志文件[通常是多行],可以看到一些问题(同时写入的并行进程,同一个文件)。

注意:在这样的解释中,我使用广义上的“网络服务器”。这包括 gunicorn、mod-wsgi 等。

【讨论】:

  • 因此,如果 webserver 仅启动(“open”)一个 Django 应用程序(“program”),那么直到当前请求不会被提供之前,另一个请求将被挂起?
  • "django支持的数据库支持并发"。这是否意味着当某个请求到达 DBMS 并等待该 DBMS 的响应时,django 可以处理下一个 http 请求?如果是这样,为什么我们有像 asyncio 这样的工具?
  • @Alex-droidAD: asyncio 是 python 的东西,所以用于 python 程序。内核等网络服务器和数据库实现了类似的东西(但更复杂,因为低级别:pool 和异步调用)。因此,在 django 的情况下,处理此类“异步”之类的东西的是网络服务器。
  • 第一个问题,是的。网络服务器处理与外部世界的连接,如果它获得多个流的输出,它会感到困惑。大多数网络服务器(和 gunicorn)都经过精心设计,可以以低开销处理并行请求,因此可以从服务器端应用程序(例如 Django)中卸载如此困难的任务
猜你喜欢
  • 2021-05-25
  • 2021-12-21
  • 1970-01-01
  • 2013-01-12
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多