首页 > 解决方案 > Flask:如何避免缓慢的多次导入?

问题描述

我有一个由几个蓝图组成的 Flask 应用程序,每个蓝图都位于自己的模块中。部署应用程序(使用 Apache)后,我发现对于每个蓝图,第一次响应需要几秒钟的时间。我的印象是,这与在蓝图中导入相当重的包有关(每个蓝图中的 sqlalchemy,以及一些中的 pandas / matplotlib)。

有没有办法为整个应用程序只进行一次所有导入?

或者也许我在这里偏离了轨道,第一次慢速效果来自其他东西?

[编辑]

我正在使用这样配置的 mod_wsgi:

WSGIScriptReloading On
WSGIDaemonProcess   wsgi processes=4 threads=15 display-name=%{GROUP}
WSGIProcessGroup    wsgi
WSGIScriptAlias     /dham     /var/www/wsgi/dham.wsgi

通过将这个 nop() 函数添加到我的每个蓝图中,我找到了一种解决方法,并且在部署时有一个脚本调用所有这些目标。

@blp.route("/nop")
def nop():
    return flask.render_template_string("")

下面是重启脚本。每个目标大约需要四秒钟,但是当我运行相同的东西而不先杀死 WSGI 时,所花费的时间几乎为零。

#!/bin/sh

echo "Killing wsgi subprocesses"
ps ax | \
    sed -nr 's/([0-9]+).*\(wsgi:wsgi\).*/kill -KILL \1/p' |\
    sudo /bin/sh
unset http_proxy

for target in doklink procontrol jobwatch admin tagestest spc; do
    curl http://localhost/dham/$target/nop > /dev/null
done

标签: flask

解决方案


我发现 Flask 不会为每个蓝图单独导入相同的包。相反,我发现不同的蓝图始于不同的流程。如果我强制 WSGI 在一个进程中运行,那么只有一个很长的加载时间。


推荐阅读