本文目錄
1.Django 多線程
Django 多線程
1.1 環境
Python3.7.3
Django==2.0.7
uWSGI==2.0.18
1.2 Django原生單線程
django 原生爲單線程序,當第一個請求沒有完成時,第二個請求輝阻塞,知道第一個請求完成,第二個請求才會執行。
Django就沒有用異步,通過線程來實現併發,這也是WSGI普遍的做法,跟tornado不是一個概念
1.3 Django server 默認多線程
官方文檔解釋django自帶的server默認是多線程
-
python3 manage.py runserver 0.0.0.0:8000
django開兩個接口,第一個接口sleep(20),另一個接口不做延時處理(大概耗時幾毫秒) 先請求第一個接口,緊接着請求第二個接口,第二個接口返回數據,第一個接口20秒之後返回數據 證明django的server是默認多線程,這個親測有效: http://192.168.56.101:8085/hello_a 和 http://192.168.56.101:8085/hello_b def hello_a(request): print 'In the hello_a' return HttpResponse('return from hello_a') def hello_b(request): print 'In the hello_b' time.sleep(5) return HttpResponse('return from hello_b')
-
python3 manage.py runserver 0.0.0.0:8000 --nothreading
重複上述步驟
2. 使用 uWSGI 服務器啓動 django
2.1 啓動 uWSGI
在django項目目錄下 Demo工程名
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
經過上述的步驟測試,發現在這種情況下啓動django項目,uWSGI也是單線程,訪問接口需要"排隊"
不給uWSGI加進程,uWSGI默認是單進程單線程
2.2 給uWSGI加進程數
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2
processes: 進程數 # processes 和 workers 一樣的效果
threads : 每個進程開的線程數
經過測試,接口可以"同時"訪問,uWSGI提供多線程
3. 總結關於django的多線程問題
Python因爲GIL的存在,在一個進程中,只允許一個線程工作,導致單進程多線程無法利用多核
多進程的線程之間不存在搶GIL的情況,每個進程有一個自己的線程鎖,多進程多GIL
單進程多線程的python應用可以實現併發,但是不存在並行
多進程的多處理器的python應用可能存在並行,至於併發還是並行,有操作系統決定,如果分配單處理器處理多進程,那就是並行,如果分配給多處理器那就是並行
Nginx+uWSGI可以實現python高併發
from: https://blog.csdn.net/Coxhuang/article/details/89953619 感謝作者的分享!