Django runserver 默認是多線程模式

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 感謝作者的分享!

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