我在Flask网络服务器中需要一个简单的测试和设置指令。 TaS的代码非常简单(我不认为这实际上是问题,但我把它放在这里是为了完整性):
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
我制作了这个样本Flask应用程序以检查它是否有效:
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}
,所以看起来我的TaS工作得很好。但是,当我将它推送到Azure dev服务器并发出两个并发请求时,我得到{"Old TaS value": 0}
和{"Old TaS value": 0}
...两个并发请求完成后我发出一个或多个新请求(并发)或不,没关系)我做总是得到{"Old TaS value": 1}
回复。
发生了什么事?看起来Azure实际上只执行多个相同并发请求中的一个,然后将其结果返回给所有请求。即使我将随机唯一获取参数添加到并发请求的URL中,它们也会以{"Old TaS value": 0}
响应。感觉就像我没有要求的非常奇怪的缓存。
答案 0 :(得分:3)
不,这不是正在发生的事情。
您的生产环境正在运行多个进程。 Python中的每个进程都有自己的内存空间。并且由于每个请求都会阻塞3秒钟,因此在该时间内发出多个请求意味着每个请求都由不同的进程提供服务。
您不应使用全局内存空间在请求之间存储内容。您需要一个外部存储,例如数据库。 Redis是这类事情的不错选择。