python - Gunicorn 使用 Vue 参考大大减慢了 Flask 的执行速度
问题描述
我正在使用 Gunicorn 运行一个非常基本的 Flask 应用程序(通过 pipenv),它被 Vue 网站引用(所以基本它并不比这个 MCVE 复杂多少)。
点文件:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[dev-packages]
[packages]
flask = "*"
flask-cors = "*"
flask-pymongo = "*"
gunicorn = "*"
[requires]
python_version = "3.5"
wsgi.py:
from helloworld import application
if __name__ == "__main__":
application.run()
你好世界.py:
from flask import Flask
from flask_cors import CORS
from flask_pymongo import PyMongo
import json
application = Flask(__name__)
CORS(application)
application.config['MONGO_DBNAME'] = 'helloworld'
mongo = PyMongo(application, config_prefix='MONGO')
@application.route("/greet")
def hello():
someone = mongo.db.people.find_one({},{"_id":0})
return json.dumps(someone)
if __name__ == "__main__":
application.run(host='0.0.0.0', port=5432)
索引.html:
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<title>Hello World!</title>
</head>
<body>
<h1>Hello</h1>
<p class="paragraph" id="app">{{ greeted }}!</p>
</body>
</html>
<script>
new Vue({
el: '#app',
data: {
greeted: ''
},
created () {
fetch('http://0.0.0.0:5432/greet')
.then(response => response.json())
.then(json => {this.greeted = json.name})
}
})
</script>
(调用mongo.db.people.find_one({},{"_id":0})
返回{"name":"World"}
)
当我使用 Flask 开发服务器运行它时:
pipenv run python helloworld.py
该网站在硬刷新时迅速获得价值。但是,如果我通过 Gunicorn 运行它:
pipenv run gunicorn -w 3 -b 0.0.0.0:5432 wsgi
返回数据可能需要几秒钟(有时大约几分钟)。
是什么导致了这种行为?
作为参考,这个问题的标题相似,但有一个不同的问题。
编辑:如果我让服务器运行足够长的时间,我会收到以下消息:
[CRITICAL] WORKER TIMEOUT (pid:XXXXX)
编辑 2:将工作人员类型更改为 gevent 似乎可以解决问题:
pipenv run gunicorn --worker-class gevent -w 3 -b 0.0.0.0:5432 wsgi
我不确定为什么(我没有做任何会导致阻塞数十秒的事情)。此外,更改为 gevent 会导致此警告:
/home/user/.local/share/virtualenvs/FlaskApp-XXXXX/lib/python3.5/site-packages/gunicorn/workers/ggevent.py:65: MonkeyPatchWarning: Monkey-patching ssl after ssl has been imported 可能会导致错误,包括 Python 3.6 上的 RecursionError。请早点进行猴子补丁。见https://github.com/gevent/gevent/issues/1016 monkey.patch_all(subprocess=True)
解决方案
推荐阅读
- java - 对 Java 字符串的 SQL 查询
- python - 如何仅将文件名的第一个字母更改为大写?
- r - R - 根据两个元素的平均值对嵌套列表进行排序/排序
- laravel - Laravel 在控制器中更改 .env 文件
- rust - 使用 arc mutex 生成线程时的生命周期问题
- angular - 为 API 服务制作组件时收到函数重载错误
- ios - 存储SecCertificate和SecKey时如何获取SecIdentity?
- r - 如何将使用 Hellinger 度量的层次聚类分析应用于 LDA 模型?
- javascript - 加载时元素闪烁
- apache-spark - 为什么 spark.jdbc 中需要 dbtable / query