flask - 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 不会为每个蓝图单独导入相同的包。相反,我发现不同的蓝图始于不同的流程。如果我强制 WSGI 在一个进程中运行,那么只有一个很长的加载时间。
推荐阅读
- php -
- c# - How to Expose Class Types from a Component within a DLL
- github - get github issues by their ids through graphql endpoints
- ibm-midrange - How to temporary disable Option 2 (ENDRQS) of the System Request menu
- fido-u2f - FIDO2 key without user presence check
- php - Removing an associated key/value pair from array (nested)
- r - R - How to count number of country of origins based on team id?
- c# - How to use current date time in xamarin forms date picker?
- python - Setup the width, size and all of the barchart (seaborn)
- asp.net-core - 在启动时注入依赖项