我看到一个奇怪的错误,我在模块范围创建的变量 - 在定义任何类或函数之前的文件顶部 - 随着时间的推移表现不同。这个变量(我们称之为_cache
)被拉入我的班级:
_cache = None
class XMLGenerator(object):
global _cache
def __init__(self, parms):
if _cache is None:
_cache = expensive_query(parms)
此缓存的结果可能会有所不同,具体取决于进入Web服务的请求的上下文,但我看到在调用同一服务之间生成的XML输出中的行为不同:我可以重新启动服务器,一切都是很棒,但最终异常行为又开始了。
uWSGI是否在某种程度上保留了请求之间的状态?
答案 0 :(得分:3)
我想回过头来解释这里发生的事情。事实上,全局变量在uWSGI中对同一服务的请求之间没有“刷新”。因此,如果您创建模块级变量,它将在多个请求之间传递状态。显然,这不是我的意图;所以我最终在不同的调用之间传递了一个缓存对象XMLGenerator
。它导致API非常难看,但避免了模块级变量的问题。
答案 1 :(得分:1)
如果您使用多个工作人员而不是您可能想要使用uwsig的CachingFramework:
http://projects.unbit.it/uwsgi/wiki/CachingFramework
否则我相信_cache在各个工人之间会有所不同。
此外,您可以使用uwsgi --processes 1进行测试,看看问题是否消失。