在我的應用程序中,通過發出請求來更改公共對象的狀態,並且響應取決於狀態。全局變量是否在燒瓶中安全?
class SomeObj():
def __init__(self, param):
self.param = param
def query(self):
self.param += 1
return self.param
global_obj = SomeObj(0)
@app.route('/')
def home():
flash(global_obj.query())
render_template('index.html')
如果我在我的開發服務器上運行這個,我期望得到1,2,3等等。如果同時請求100個不同的客戶端,是否會出現問題?預期的結果是,100個不同的客戶端都會看到1到100之間的唯一數字。或者會發生類似的情況:
- 客戶端1查詢。
self.param
由1 - 遞增可以執行return語句之前,線程切換到客戶端2.
self.param
再次增加。 - 線程切換回客戶機1,並且客戶端返回的數字2,說。
- 現在線程移動到客戶端2,返回他/她的號碼3
由於只有兩個客戶,預期的結果是1和2,而不是2和3的一些被跳過。
會我擴大我的應用程序這實際上發生的呢?我應該看一下全球變量的其他選擇嗎?
這似乎不回答問題。另外,當Flask 1.0發佈時,它將不再安全工作,默認情況下它會切換到啓用線程。不要這樣做。如果您需要輕量級和本地可用的東西,請使用SQLite數據庫。 – davidism
@davidism謝謝我錯了關於sqlite3的限制。我也考慮完全回答我的答案。正如你所說,它根本不回答OP。然而,經過相當多的谷歌搜索這是我發現的最相關和有用的信息,所以我認爲這可能會在某個階段幫助某人。因爲Stackoverflow已經成爲* all *編程答案的第一位來源,所以這些問題必須根據谷歌查詢來解釋,而不是OP的實際措辭! – paddyg
以「非線程安全機制」開頭的「是全局變量線程安全」的答案顯然不是對問題的回答,而且實際上並沒有幫助。如果你想自我回答一個關於如何在Raspberry Pi上使用SQLite或單線程應用的問題,那就不要把它放在一個無關的問題上。 – davidism