烧瓶:如何避免缓慢地多次进口?

时间:2019-09-02 13:43:30

标签: 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

1 个答案:

答案 0 :(得分:0)

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