我有一个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
答案 0 :(得分:0)
我发现Flask不会为每个蓝图分别导入相同的软件包。相反,我发现不同的蓝图始于不同的过程。如果我强迫WSGI在一个进程中运行,那么只有很长的加载时间。