调试关闭时由于 flask-assets 管道超时
Timeout due to flask-assets pipeline when debug is turned off
我有一个基于 Flask 的应用程序,它使用 flask-assets 来捆绑、编译和缩小 css 和 Javascript。当我使用
使用 gunicorn 启动应用程序时发生超时
gunicorn --bind=0.0.0.0:8000 --workers=3 --log-level=INFO manage:app
超时消息指出:
[2018-04-01 11:15:13 +0000] [10] [INFO] Starting gunicorn 19.6.0
[2018-04-01 11:15:13 +0000] [10] [INFO] Listening at: http://0.0.0.0:8000 (10)
[2018-04-01 11:15:13 +0000] [10] [INFO] Using worker: sync
[2018-04-01 11:15:13 +0000] [16] [INFO] Booting worker with pid: 16
[2018-04-01 11:15:13 +0000] [17] [INFO] Booting worker with pid: 17
[2018-04-01 11:15:13 +0000] [18] [INFO] Booting worker with pid: 18
[2018-04-01 11:15:46 +0000] [10] [CRITICAL] WORKER TIMEOUT (pid:17)
[2018-04-01 11:15:47 +0000] [17] [INFO] Worker exiting (pid: 17)
[2018-04-01 11:15:47 +0000] [19] [INFO] Booting worker with pid: 19
我已经在 assets.py
文件中定义了内容为
的资产
from flask_assets import Bundle
app_css = Bundle('app.scss', filters='libsass', output='styles/app.css')
app_js = Bundle('app.js', filters='jsmin', output='scripts/app.js')
vendor_css = Bundle(
'vendor/semantic.css',
filters='cssmin',
output='styles/vendor.css')
vendor_js = Bundle(
'vendor/jquery.min.js',
'vendor/semantic.min.js',
'vendor/tablesort.min.js',
'vendor/zxcvbn.js',
filters='jsmin',
output='scripts/vendor.js')
主应用中的相关部分__init__.py
是
from flask_assets import Environment
from .assets import app_css, app_js, vendor_css, vendor_js
def create_app(config_name):
...
# Set up asset pipeline
assets_env = Environment(app)
dirs = ['assets/styles', 'assets/scripts']
for path in dirs:
assets_env.append_path(os.path.join(basedir, path))
assets_env.url_expire = True
assets_env.register('app_css', app_css)
assets_env.register('app_js', app_js)
assets_env.register('vendor_css', vendor_css)
assets_env.register('vendor_js', vendor_js)
问题来了,如何避免超时呢?是否可以在 gunicorn 开始等待之前预编译资产?
该解决方案需要进行两项更改才能工作,为 gunicorn 启用预加载 和运行 工厂中的资产管道。要启用预加载,请将 --preload
添加到 gunicorn 命令中:
gunicorn --bind=0.0.0.0:8000 --workers=3 --preload --log-level=INFO manage:app
如果没有另外指定,资产管道将以惰性方式 运行,即当请求首先需要其资产时。这意味着如果 build()
没有明确调用,第一个请求将阻塞并可能超时。因此,对于 create_app
函数中的每个 Bundle
对象调用包:
app_css.build()
app_js.build()
vendor_css.build()
vendor_js.build()
如果只在gunicorn中启用了预加载或者之前没有显式构建的Bundle,构建命令会在第一次请求时被调用然后超时。
奖励:要加快您的 Travis CI 构建速度,请将 app/static/.webassets-cache
添加到 .travis.yml
中的缓存:
cache:
pip: true
directories:
- core/app/static/.webassets-cache
我有一个基于 Flask 的应用程序,它使用 flask-assets 来捆绑、编译和缩小 css 和 Javascript。当我使用
使用 gunicorn 启动应用程序时发生超时gunicorn --bind=0.0.0.0:8000 --workers=3 --log-level=INFO manage:app
超时消息指出:
[2018-04-01 11:15:13 +0000] [10] [INFO] Starting gunicorn 19.6.0
[2018-04-01 11:15:13 +0000] [10] [INFO] Listening at: http://0.0.0.0:8000 (10)
[2018-04-01 11:15:13 +0000] [10] [INFO] Using worker: sync
[2018-04-01 11:15:13 +0000] [16] [INFO] Booting worker with pid: 16
[2018-04-01 11:15:13 +0000] [17] [INFO] Booting worker with pid: 17
[2018-04-01 11:15:13 +0000] [18] [INFO] Booting worker with pid: 18
[2018-04-01 11:15:46 +0000] [10] [CRITICAL] WORKER TIMEOUT (pid:17)
[2018-04-01 11:15:47 +0000] [17] [INFO] Worker exiting (pid: 17)
[2018-04-01 11:15:47 +0000] [19] [INFO] Booting worker with pid: 19
我已经在 assets.py
文件中定义了内容为
from flask_assets import Bundle
app_css = Bundle('app.scss', filters='libsass', output='styles/app.css')
app_js = Bundle('app.js', filters='jsmin', output='scripts/app.js')
vendor_css = Bundle(
'vendor/semantic.css',
filters='cssmin',
output='styles/vendor.css')
vendor_js = Bundle(
'vendor/jquery.min.js',
'vendor/semantic.min.js',
'vendor/tablesort.min.js',
'vendor/zxcvbn.js',
filters='jsmin',
output='scripts/vendor.js')
主应用中的相关部分__init__.py
是
from flask_assets import Environment
from .assets import app_css, app_js, vendor_css, vendor_js
def create_app(config_name):
...
# Set up asset pipeline
assets_env = Environment(app)
dirs = ['assets/styles', 'assets/scripts']
for path in dirs:
assets_env.append_path(os.path.join(basedir, path))
assets_env.url_expire = True
assets_env.register('app_css', app_css)
assets_env.register('app_js', app_js)
assets_env.register('vendor_css', vendor_css)
assets_env.register('vendor_js', vendor_js)
问题来了,如何避免超时呢?是否可以在 gunicorn 开始等待之前预编译资产?
该解决方案需要进行两项更改才能工作,为 gunicorn 启用预加载 和运行 工厂中的资产管道。要启用预加载,请将 --preload
添加到 gunicorn 命令中:
gunicorn --bind=0.0.0.0:8000 --workers=3 --preload --log-level=INFO manage:app
如果没有另外指定,资产管道将以惰性方式 运行,即当请求首先需要其资产时。这意味着如果 build()
没有明确调用,第一个请求将阻塞并可能超时。因此,对于 create_app
函数中的每个 Bundle
对象调用包:
app_css.build()
app_js.build()
vendor_css.build()
vendor_js.build()
如果只在gunicorn中启用了预加载或者之前没有显式构建的Bundle,构建命令会在第一次请求时被调用然后超时。
奖励:要加快您的 Travis CI 构建速度,请将 app/static/.webassets-cache
添加到 .travis.yml
中的缓存:
cache:
pip: true
directories:
- core/app/static/.webassets-cache