我正在使用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。
答案 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流程的连接,并且可以将这些数据保持更长时间。