Flask拾遺筆記之上下文

0x01 背景知識

threading.local()

通過threading.local()可以創(chuàng)建一個線程安全的全局變量攀芯,即在一線程中的修改不會影響另一線程盯仪。結(jié)合代碼說明:

import threading
storage = threading.local() # (1)
storage.foo = 1
print(storage.foo)
class AnotherThread(threading.Thread):
     def run(self):
        # 這里的 storage和定義在(1)處的并非同一個,他們只是“名字一樣”的兩個變量
        storage.foo = 2
        print(storage.foo)
another = AnotherThread()
another.start()
print(storage.foo)
# 由于“并非”同一個變量颠蕴,所以輸出應(yīng)該是
1
2
1

通過修改代碼驗證“名同實不同”:

import threading
storage = threading.local() # (1)
storage.foo = 1
print(storage.foo)
class AnotherThread(threading.Thread):
     def run(self):
        # 運行會報錯 '_thread._local' object has no attribute 'foo'
        # 從錯誤信息可以看出牵啦,這個線程里面的storage和(1)處的并非同一個
        print(storage.foo) 
another = AnotherThread()
another.start()
print(storage.foo)

所以threading.local()是通過創(chuàng)建“名同實不同”的“全局變量”茎活。

LocalProxy 和 LocalStack

這兩個都是基于 werkzeug.local.Local實現(xiàn)。

werkzeug.local.Localthreading.local只有兩個不同辖众,一個是前者優(yōu)先使用Greenlet的ID卓起,其次是線程ID;二是前者實現(xiàn)了一個析構(gòu)方法(__release_local__)來析構(gòu)(刪除)創(chuàng)建的werkzeug.local.Local對象凹炸。

總的來說戏阅,前者是web升級版的threading.local. 那么顧名思義,LocalProxyLocalStack分別是線程安全的代理和線程安全的棧啤它。

0x02 上下文

關(guān)于上下文奕筐,已經(jīng)有很好的介紹文章了(見文末),我這里只做一些補充变骡。

線程不安全的情況

在單App的情況下离赫,通過current_app修改app配置會影響到其它線程。

# 在這種情況下塌碌,第二個請求時的 secret_key 的值是'new'. 其它線程顯然也會受到影響渊胸。

from flask import Flask, current_app
app = Flask(__name__)
app.secret_key = 'key'

@app.route('/')
def foo():
    print(current_app.secret_key)
    current_app.secret_key = 'new'

if __name__ == '__main__':
    app.run(threaded=True)
```

## 為什么要有LocalProxy

按前文所述,通過``` LocalProxy ```拿到的是一個“名同實不同”的變量台妆。例如``` flask ```中的``` request ```, 他就是一個``` LocalProxy ```對象翎猛,我們經(jīng)常需要通過這個變量拿到一些請求參數(shù)。這時接剩,將其變成“名同實不同"的全局變量办成,顯然要比在每個視圖函數(shù)中都傳入一個``` request ```參數(shù)來得方便。

## 為什么要有LocalStack
按前文所述搂漠,通過``` LocalProxy ```存儲的是“名同實不同”的變量迂卢。我們已經(jīng)知道這種“名同實不同”的變量會讓我們在不同線程中方便地使用同一名稱的變量,但是如果一個線程中有多個變量呢桐汤?

> 只有棧結(jié)構(gòu)才能保存多個 Context 并在其中定位出哪個才是“當(dāng)前”而克。

在作為一個簡單的網(wǎng)站后臺時,一般不會有這種情況怔毛,因為一個HTTP請求對于一個request 環(huán)境和一個 application 環(huán)境员萍。但是,在離線測試的時候拣度,可能會推入棧中多個context碎绎。

----
相關(guān)好文

>Flask 的 Context 機(jī)制 —— Jiangge Zhang
 https://blog.tonyseek.com/post/the-context-mechanism-of-flask/
>flask 源碼解析:上下文 ——  [**cizixs**](https://segmentfault.com/u/cizixs)
https://segmentfault.com/a/1190000008383197
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螃壤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筋帖,更是在濱河造成了極大的恐慌奸晴,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件日麸,死亡現(xiàn)場離奇詭異寄啼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)代箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門墩划,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗡综,你說我怎么就攤上這事乙帮。” “怎么了极景?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵蚣旱,是天一觀的道長。 經(jīng)常有香客問我戴陡,道長塞绿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任恤批,我火速辦了婚禮异吻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喜庞。我一直安慰自己诀浪,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布延都。 她就那樣靜靜地躺著雷猪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晰房。 梳的紋絲不亂的頭發(fā)上求摇,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機(jī)與錄音殊者,去河邊找鬼与境。 笑死,一個胖子當(dāng)著我的面吹牛猖吴,可吹牛的內(nèi)容都是我干的摔刁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼海蔽,長吁一口氣:“原來是場噩夢啊……” “哼共屈!你這毒婦竟也來了绑谣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拗引,失蹤者是張志新(化名)和其女友劉穎借宵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺擂,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡暇务,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年泼掠,在試婚紗的時候發(fā)現(xiàn)自己被綠了怔软。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡择镇,死狀恐怖挡逼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腻豌,我是刑警寧澤家坎,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站吝梅,受9級特大地震影響虱疏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苏携,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一做瞪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧右冻,春花似錦装蓬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乳蛾,卻和暖如春暗赶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肃叶。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工忆首, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人被环。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓糙及,卻偏偏與公主長得像,于是被迫代替她去往敵國和親筛欢。 傳聞我的和親對象是個殘疾皇子浸锨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容