2017-07-30 64 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是这类事情的不错选择。

相关问题