3

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

_cache = None

class XMLGenerator(object):
    global _cache

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

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

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

4

2 回答 2

3

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

于 2013-12-28T04:36:31.950 回答
1

如果您使用多个工作人员执行此操作,那么您可能想要使用 uwsig 的 CachingFramework:

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

否则,我相信 _cache 在工作人员中可能会有所不同。

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

于 2012-08-24T18:09:08.290 回答