一、線程、進程
- 線程:cpu調度的基本單位。是進程的一部分,能夠訪問進程的資源,線程間的切換,資源消耗相對少。
- 進程:系統內存資源分配的基本單位。進程的切換需要保存應用的執行狀態(應用的上下文),相對於線程,進程切換的開銷大。
二、Flask開啟多線程、多進程
- flask自帶的服務器默認是單進程、單線程;
- 多線程:app.run(...., threader=True)
- 多進程:app.run(...., processes=1)
三、Flask多線程
- 單線程:request---->請求1 Request,請求2 Request,....。請求順序執行,request總是指向當前請求。
- 多線程:request---->{請求1 Request,請求2 Request,....}。多線程的情況下,在某一時間多個請求會同時存在,此時不清楚request指向哪個請求,帶來的問題是造成數據的污染。解決的辦法是通過線程隔離,實現數據的獨立。
四、線程隔離
- 通過字典的思想實現線程隔離。線程的id作為key,Request對象作為value。
- Flask中通過第三方庫werkzeug中的local模塊Local對象實現線程隔離。
import threading import time from werkzeug.local import Local my_1 = Local() my_1.b = 0 # 新線程中,b的值被修改 def worker(): my_1.b = 1 print(my_1.b) new_t = threading.Thread(target=worker) new_t.start() time.sleep(1)
# 主線程中,b的值沒有改變 print(my_1.b)