Django Flask是多線程應用嗎?

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章