4

我正在烧瓶/python中编写一个服务器端应用程序,并且有一些必须加载以进行计算的数据的问题。加载数据(大约 40 MB)需要更长的时间来处理服务器响应,并且数据永远不会改变,所以我希望它只加载一次,在 apache 启动时有效。但是无论我尝试什么,每次请求进入时它都会重新加载并大大减慢速度。我可以通过下面显示的打印语句来判断,它为每个请求写入 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 并将“WSGIDaemonProcess myApp processes=1”添加到我的 WSGI 配置中就可以了。现在它保持进程运行,只是从中产生新的请求,而不是每次都重新运行 init。

4

1 回答 1

3

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

不要这里使用 Flask-Cache;它不能保证数据保持加载(它会保证数据加载的时间最长,而不是最短时间)。

app.before_first_request()您可以使用处理程序加载数据:

@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 部署mod_wsgi

于 2014-09-15T09:39:48.497 回答