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

时间:2012-06-23 00:43:29

标签: python django scope uwsgi

我看到一个奇怪的错误,我在模块范围创建的变量 - 在定义任何类或函数之前的文件顶部 - 随着时间的推移表现不同。这个变量(我们称之为_cache)被拉入我的班级:

_cache = None

class XMLGenerator(object):
    global _cache

    def __init__(self, parms):
        if _cache is None:
             _cache = expensive_query(parms)

此缓存的结果可能会有所不同,具体取决于进入Web服务的请求的上下文,但我看到在调用同一服务之间生成的XML输出中的行为不同:我可以重新启动服务器,一切都是很棒,但最终异常行为又开始了。

uWSGI是否在某种程度上保留了请求之间的状态?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

如果您使用多个工作人员而不是您可能想要使用uwsig的CachingFramework:

http://projects.unbit.it/uwsgi/wiki/CachingFramework

否则我相信_cache在各个工人之间会有所不同。

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