Django在生产环境中如何处理多个请求?
假设我们有一个Web服务器:Apache,Nginx,gunicorn等。
那么这些服务器是否针对来自Web浏览器的任何请求启动新进程来提供该请求?
如果是这样,是否会导致巨大的开销?
如果不是这样,那么同一个视图(例如绑定到/hello
URL的def hello(request)
视图)如何同时服务于多个请求。
我看到过关于“...如何处理多个用户”的答案。
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等。
$ watch "ps aux | grep http "
. 请注意,请求是通过单独的进程服务的。只有当工作需要大量CPU、内存或IO时,才会导致巨大负载。 - JacobIRR