一、Django 開發環境與生產環境
開發/調試
python manage.py runserver 0.0.0.0:8080
生產環境
Nginx + uWSGI + supervisor
生產環境不用
python manage.py runserver 0.0.0.0:8080
的原因:性能。
二、Django 多進程多線程
-
python manage.py runserver 默認多線程(Django 1.x 版本以后) --nothreading 單線程
-
Flask/tornado 默認單線程
-
不給 uWSGI 加進程,uWSGI 默認單進程單線程
-
給 uWSGI 加進程、線程:--processes 4 –-threads 2(每個進程開的線程數)
三、並行並發
-
並行:兩個或者多個事件在 同一時間點 發生。
-
並發:兩個或多個事件在 同一時間間隔 發生。
Python、Java多線程區別:對於 Python,不管有多少處理器,任何時候只有一個線程在執行,但是 Java 可以同時開啟多個線程進行處理。
Python GIL鎖,導致 Python 不能充分利用多核。
IO阻塞型/CPU計算型任務區別:CPU密集型 也叫計算密集型,指的是進行大量的計算、邏輯判斷等CPU動作,消耗CPU資源。IO阻塞型 指的是進行大量的I/O讀/寫操作。
多線程/多進程:多線程 就是指一個進程中同時有多個線程正在執行。多進程 就是指計算機同時執行多個進程,一般是同時運行多個軟件。
Python:多核不存在多線程並行,但是可以多進程並行。
四、進程線程
問:單核 CPU,單進程,單線程,線程始終在這一個 CPU 上運行?
答:是。
問:多核 CPU,單進程,單線程,線程始終在同一個 CPU 上運行?
答:默認不是,但是代碼中可以綁定。
問:多核 CPU,單進程,多線程,多個線程並行在多個 CPU 上還是某一時刻只有一個線程運行在一個 CPU 上、其他線程等待?
答:因為 GIL 存在,一個進程中只允許一個線程在運行,但是這個線程會在不同 CPU 之間切換。
Python 多線程:計算圓周率 pi
def function(p):
for i in range(1, 10000000000000000):
z = i % 2
f = 1 / (2 * i - 1)
if z == 0:
f = (-1) * f
p += f
if __name__ == "__main__":
p = 0
function(p)
p *= 4
C語言多線程:計算圓周率 pi
#include <stdio.h>
int main(){
//計算π的值
int i;
int z;
double f;
double p=0;
for(i=1;i<=10000000000000000;i++){
//取模
z=i%2;
//每項
f=(double)1/(2*i-1);
//z等於0的時候是負數
if(z==0){
f=-1*f;
}
//加一起
p+=f;
}
//最終π的值
p=p*4;
printf("%.100lf",p);
}