Python 与uWSGI一起使用时,模块级变量是否安全?

Python 与uWSGI一起使用时,模块级变量是否安全?,python,django,scope,uwsgi,Python,Django,Scope,Uwsgi,我看到了一个奇怪的错误,我在模块范围内创建的变量(如中所示,在定义任何类或函数之前在文件顶部创建的变量)随着时间的推移表现出不同的行为。这个变量(我们称之为\u cache)被拉入我的类中: _cache = None class XMLGenerator(object): global _cache def __init__(self, parms): if _cache is None: _cache = expensive_qu

我看到了一个奇怪的错误,我在模块范围内创建的变量(如中所示,在定义任何类或函数之前在文件顶部创建的变量)随着时间的推移表现出不同的行为。这个变量(我们称之为
\u cache
)被拉入我的类中:

_cache = None

class XMLGenerator(object):
    global _cache

    def __init__(self, parms):
        if _cache is None:
             _cache = expensive_query(parms)
根据进入web服务的请求的上下文,此缓存的结果可能会有所不同,但我看到对同一服务的调用之间产生的XML输出行为有所不同:我可以重新启动服务器,一切都很好,但最终异常行为会再次开始


uWSGI是否以某种方式保留请求之间的状态?

如果您使用多个工作线程执行此操作,则可能需要使用uWSGI的cachingframew:

http://projects.unbit.it/uwsgi/wiki/CachingFramework
否则,我相信,不同的员工之间的缓存可能会有所不同


此外,您还可以使用uwsgi--Processs 1进行测试,看看问题是否消失。

我想回过头来解释一下这里发生了什么。事实上,在uWSGI中,对同一服务的请求之间不会“刷新”全局变量。因此,如果您创建一个模块级变量,它将在多个请求之间传递状态。这显然不是我的本意;因此,我最终在不同调用之间向
XMLGenerator
传递了一个缓存对象。这导致API非常难看,但避免了模块级变量的问题。

您能描述一下异常行为吗?另外,如果您不认为uWSGI保留了请求之间的值,那么您在_cache中缓存什么?另外,您的类定义是错误的:parms不应该既是基类又是初始值设定项的参数,对吧?XMLGenerator被多次调用以构建集合的一个XML表示。在点击之间需要缓存各种对象,否则会出现
n+1
问题。在最初的几个请求中,我看到了预期生成的标记,然后它只是。。。停止。另外,很好地理解了这个例子。这只是对概念的快速抽象。我现在已经编辑过了。