Flask - 数据加载的缓存结果

时间:2014-09-14 14:33:58

标签: python python-2.7 flask flask-cache

我正在使用flask / python编写服务器端应用程序,并且存在一些必须加载以进行计算的数据的问题。加载数据(大约40 MB)需要花费更长的时间来处理服务器响应,并且数据永远不会更改,所以我希望它只加载一次,当apache启动时有效。但无论我尝试什么,它都会在每次请求进入时不断重新加载并大幅减慢速度。我可以通过下面显示的print语句告诉我,它会写入每个请求的apache日志。我想加载数据,因此只能在启动时将该行写入日志。

有趣的是,这只发生在WSGI上通过apache运行脚本时 - 如果我从命令行使用python在本地运行它,数据加载只发生一次,服务器响应更快。

有什么想法吗?

我最近的尝试,使用flask_cache,是这样的:

@cache.cached(key_prefix = 'my_key')
def load_huge_file():
 #Do some things and assign data from a large file to loaded_data
 print "Huge data set loaded!"
 return loaded_data

shared_data = load_huge_file()

@app.route("/user_input")
def user_response():
 global shared_data
 return fairly_quick_function(args, shared_data)

编辑 - 谢谢 - 使用before_first_request并在我的WSGI配置中添加“WSGIDaemonProcess myApp processes = 1”就可以了。现在它使进程保持运行并且只是将新请求从其中转出,而不是每次都重新运行init。

1 个答案:

答案 0 :(得分:2)

您必须在每个进程时加载一次;多少次取决于你如何配置WSGI。

这里使用Flask-Cache;它不能保证数据仍然被加载(它承诺数据加载最大时间,绝不是最小值。)

您可以使用app.before_first_request() handler加载数据:

@app.before_first_request
def load_huge_file():
    #Do some things and assign data from a large file to loaded_data
    print "Huge data set loaded!"
    global shared_data
    shared_data = loaded_data

但是在导入模块时加载它也应该没问题,除非你在Flask开发服务器处于重载模式下运行它。您已经在导入时执行此操作,但@cache.cached()装饰器在此处不起作用,因为它会终止您的其他缓存数据。

如果您在每个请求上看到加载的数据,那么您的WSGI配置是错误的;它是Apache为每个请求创建一个新进程。调整WSGI设置以使用守护进程模式(使用WSGIDaemonProcess);这样就可以断开创建流程与Apache流程的连接,并且可以将这些数据保持更长时间。

另见Flask deployment on mod_wsgi documentation