1.首先Django和Flask是一个Web框架,并不是一个应用
2.既然是一个框架就不存在多线程应用的说法,即使是通过框架研发的应用也不是多线程的。
3.为什么本地开发和测试中可以并发处理多个请求?
3.1 Django官网文档:https://docs.djangoproject.com/en/3.2/ref/django-admin/
本地开发环境是通过 manage.py runserver 启动的,默认是启动的多线程服务,如果想关闭可以使用下方参数 --nothreading
3.2 Flask中的app.run 是启动的单进程服务,不过可通过threaded=True 和processes=2 这两个参数开启多进程或多线程,多进程和多线程是不能同时开启的。
4.生产环境需要使用哪种技术处理并发?
最常见的就是Nginx + uWSGI + Django/Flask应用 架构
客户端 <-> web 服务器(Nginx 为例) <-> socket <-> WSGI(uWSGI为例) <-> Django
中间的 WSGI 一层可以换成任意遵循 WSGI 的程序,比如常见的两种 Gunicorn 以及 uWSGI
Django 具体怎么支持并发的请求,取决于 WSGI 程序的实现
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 # This will spawn 4 processes (each with 2 threads)
流程:
首先客户端请求服务资源,Nginx作为直接对外的服务接口,接收到客户端发送过来的请求,会解包、分析,
如果是静态文件请求就根据Nginx配置的静态文件目录,返回请求的资源,
如果是动态的请求,Nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将根据请求调用Django工程的某个文件或函数,
处理完后Django将返回值交给uWSGI,
uWSGI接收后转发给Nginx,Nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
作用:
1. 第一级的Nginx并不是必须的,uWSGI完全可以完成整个的和浏览器交互的流程;
2. 在Nginx上加上安全性或其他的限制,可以达到保护程序的作用;
3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而Nginx可以代理多台uWSGI完成uWSGI的负载均衡;
4. Django在debug=False下对静态文件的处理能力不是很好,而用Nginx来处理更加高效。
5.Django使用的wsgiref库, Flask使用的werkzeug库实现的本地开发环境启动Web Server。
参考:
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html?highlight=threads
https://docs.djangoproject.com/en/3.2/ref/django-admin/
https://www.zhihu.com/question/56472691/answer/293292349
https://blog.csdn.net/c465869935/article/details/53242126