Django如何处理多个请求?

40

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

假设我们有一个Web服务器:Apache,Nginx,gunicorn等。
那么这些服务器是否针对来自Web浏览器的任何请求启动新进程来提供该请求?
如果是这样,是否会导致巨大的开销?
如果不是这样,那么同一个视图(例如绑定到/hello URL的def hello(request)视图)如何同时服务于多个请求。

我看到过关于“...如何处理多个用户”的答案。


你是否在Unix环境下,可以访问命令行以便查看Apache日志、ps等?如果是,你可以运行以下命令来查看请求和HTTP流量进程:$ watch "ps aux | grep http ". 请注意,请求是通过单独的进程服务的。只有当工作需要大量CPU、内存或IO时,才会导致巨大负载。 - JacobIRR
是的,但问题仍然是理论上的。例如,使用数据库可能会导致IO非常密集。 - Alex-droid AD
4
关于Python Web服务器的工作原理,您可能会发现阅读这一系列文章很有趣。https://ruslanspivak.com/lsbaws-part1/ - Graham Dumpleton
这篇文章是关于Apache/mod_wsgi的,但也可能会对WSGI服务器中进程和线程的使用感兴趣。http://modwsgi.readthedocs.io/en/develop/user-guides/processes-and-threading.html - Graham Dumpleton
请参阅https://zh.wikipedia.org/wiki/Fork_(系统调用)。 - wim
1个回答

28

Django只能处理一次请求。

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

有许多附加的Web服务器接口,它们不会在每个请求中加载一个新的服务器端程序。FastCGI是其中之一(与编程语言无关),有些程序直接在Web服务器中实现了自己的模块(例如mod-php)[Python过去也有这样的方式]。但是现在Django和通常的Python更喜欢WSGI接口。

因此,Web服务器并行打开一个或多个程序(Django应用程序)。Web服务器将向一个空闲的进程发送请求(或将请求排队,这由Web服务器处理)。有多少个进程以及多长时间,这取决于Web服务器配置。

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

注意:在这种解释中,我使用“Web服务器”作为广义概念。这包括gunicorn、mod-wsgi等。


2
那么,如果 Web 服务器只启动(“打开”)一个 Django 应用程序(“程序”),那么在当前请求未被服务之前,另一个请求将会被挂起吗? - Alex-droid AD
1
Django支持的数据库支持并发。这是否意味着当某个请求命中DBMS并等待来自该DBMS的响应时,Django可以处理下一个HTTP请求?如果是这样,为什么我们需要像asyncio这样的工具呢? - Alex-droid AD
@Alex-droidAD:asyncio是Python的一个模块,主要用于Python程序。内核、Web服务器和数据库实现类似的东西(但更复杂,因为涉及到低级别的“池”和异步调用)。所以在Django中,处理这种“asyncio”类似的东西是由Web服务器来完成的。 - Giacomo Catenazzi
对于第一个问题,是的。Web服务器处理与外部世界的连接,如果它收到几个流的输出,那么会感到困惑。大多数Web服务器(和Gunicorn)都设计得非常好,可以处理并行请求,并具有低开销,因此可以将这种困难的任务从服务器端应用程序(例如Django)卸载。 - Giacomo Catenazzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接