2017-07-30 24 views
0

我需要一個簡單的測試和設置指令在我的Flask網絡服務器。爲TAS的代碼是非常簡單的(我不認爲這是問題的實際,但我把它在這裏的完整性):自制Python TaS本地工作,不在Azure服務器上

from threading import Lock 

class TaS: 
    def __init__(self, default): 
     self.__lock = Lock() 
     self.__value = default 

    def update(self, new): 
     self.__lock.acquire() 
     old = self.__value 
     self.__value = new 
     self.__lock.release() 
     return old 

我做了這個樣本瓶應用程序來檢查它是否工作:

from Asdf import app 
from ...helpers import TaS 
from time import sleep 
from flask import jsonify  

l = TaS(0) 

@app.route("/test") 
def test(): 
    old = l.update(1) 
    sleep(3) 
    return jsonify({"Old TaS value" : old}) 

現在,當我運行這個地方,並在3秒內2個請求,我得到的答覆是:{"Old TaS value": 0}{"Old TaS value": 1},所以它看起來像我的助教工作得很好。但是,當我將它推送到Azure開發服務器併發出兩個併發請求時,我得到{"Old TaS value": 0}{"Old TaS value": 0} ...兩個併發請求完成後,我發出一個或多個新請求(併發或不同意,這並不重要)我總是得到{"Old TaS value": 1}迴應。

這是怎麼回事?它看起來像Azure實際上只執行多個相同的併發請求中的一個,然後將其結果返回給所有請求。即使在向併發請求的URL添加隨機唯一獲取參數時,它們也都以{"Old TaS value": 0}作爲響應。這感覺就像我沒有要求的非常奇怪的緩存。

回答

3

不,這不是發生了什麼事。

您的生產環境正在運行多個進程。 Python中的每個進程都有自己的內存空間。由於每個請求都會阻塞3秒,因此在該時間內發出多個請求意味着每個請求都由不同的進程提供服務。

您不應該使用全局內存空間在請求之間存儲事物。您需要一個外部存儲,如數據庫。 Redis是這類事情的不錯選擇。

相關問題