在mod_wsgi下使用缓存用于Python Web框架

时间:2013-01-09 08:04:24

标签: python flask mod-wsgi

代码是这样的(我正在使用flask和flask-cache,但这可能是一个普遍的问题):

@cache.memoize(500000)
def big_foo(a,b):
    return a + b + random.randrange(0, 1000)

如果我在Python intepreter中运行它,我可以通过调用big_foo(1,2)来获得相同的结果。

但是如果我在应用程序中添加此函数并使用mod_wsgi守护进程,则在浏览器中请求。 (在该请求的views函数中调用big_foo)。我发现每次结果都不一样。

我认为结果每次都不同,因为mod_wsgi使用多个流程来启动应用。每个进程可能都有自己的缓存,并且进程之间无法共享缓存。

我猜对了吗?如果正确,我如何为全局访问分配一个且仅一个缓存?如果没有,我的代码出错了?

以下是用于flask-cache

的配置
UPLOADS_FOLDER = "/mnt/Storage/software/x/temp/"                                                                                 
class RadarConfig(object):                                                                                                                   
    UPLOADS_FOLDER = UPLOADS_FOLDER                                                                                                          
    ALLOWED_EXTENSIONS = set(['bed'])                                                                                                        
    SECRET_KEY = "tiananmen"                                                                                                                 
    DEBUG = True                                                                                                                             
    CACHE_TYPE = 'simple'                                                                                                                    
    CACHE_DEFAULT_TIMEOUT = 5000000                                                                                                          
    BASIS_PATH = "/mnt/Storage/software/x/NMF_RESULT//p_NMF_Nimfa_NMF_Run_30632__metasites_all"                              
    COEF_PATH = "/mnt/Storage/software/x/NMF_RESULT/MCF7/p_NMF_Nimfa_NMF_Run_30632__metasample_all"                              
    MASK_PATH = "/mnt/Storage/software/x/NMF_RESULT/dhsHG19.bed"    

1 个答案:

答案 0 :(得分:4)

这是你的问题:CACHE_TYPE = 'simple'。来自SimpleCache documentation

  

单个进程环境的简单内存缓存。该类主要用于开发服务器,并非100%线程安全。

对于生产而言,更适合的后端是memcachedredisfilesystem,因为它们旨在在并发环境中工作。