標籤:tac 資料結構 src rom 檔案建立 變數 for 請求 總結
30、LocalStack作為線程隔離對象的意義 30.1 資料結構 限制了某些能力 30.2 線程隔離
# -*- coding=utf-8 -*-import threadingimport timefrom werkzeug.local import LocalStackmy_stack = LocalStack()my_stack.push(1)print(‘in main thread after push, value is:‘ + str(my_stack.top))def worker(): # 新線程 print(‘in new thread before push, value is:‘ + str(my_stack.top)) my_stack.push(2) print(‘in new thread after push, value is:‘ + str(my_stack.top))new_t = threading.Thread(target=worker, name=‘qiyue_thread‘)new_t.start()time.sleep(1)
test/LocalStack.py
30.3 flask為什麼需要棧結構
需要棧結構,將兩個上下文推到棧中去
30.4 為什麼需要LocalStack 需要棧是線程隔離的 30.5 線程隔離意義 是當前線程能夠正確引用到他自己所建立的對象,而不是引用到其他線程所建立的對象 (1)用一個變數名(request)同事指向多個線程所建立的多個執行個體化對象是不可能的 (2)可以做到,在當前線程,在引用request(變數名)可以正確找到當前線程它自己所執行個體化的Request對象 30.6 請求上下文包含Request對象,所以,Request也是被線程隔離的 session也是線程隔離 30.7 知識梳理 (1)線程隔離對象 LocalStack和local是線程隔離對象 (2)被線程隔離的對象 通過線程隔離對象來建立被線程隔離的對象 (3)flask的核心對象app作為一個屬性存在於AppContext的應用上下文下 核心對象app只有一個,是在入口檔案建立,在主線程中被建立 (4)多線程編程痛點 安全執行緒 線程隔離 30.8 總結 (1)Local->LocalStack,線程隔離對象實現 Local內部有一個字典,以線程ID號作為key LocalStack如何??LocalStack封裝了Local 操作Local,通常使用.去訪問下面的屬性;使用LocalStack,需要使用那幾個常用的方法和屬性,push、pop、top (2)AppContext->RequestContext 請求進來,會被推入到LocalStack的棧中去,同時在請求結束時,AppContext和RequestContext會被pop彈出去 (3)Flask->AppContext Request->RequestContext AppContext重要特點,將Flask核心對象作為它的一個屬性,儲存了起來 RequestContext請求上下文,將請求對象Request封裝和儲存 (4)current_app->(LocalStack.top=Appcontext top.app=Flask) current_app指向的是LocalStack下面的棧頂元素的一個屬性,也就是top.app,Flask的核心對象 棧頂元素為應用上下文 (5)request->(LocalStack.top=RequestContext top.request=Request) request實際指向的是LocalStack棧頂元素下面的Request請求對象
flask進階編程-LocalStack線程隔離