- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个想法表明不要在生产环境中使用 gunicorn 或 uwsgi 运行 flask 应用程序。 Tiangolo 在他的一个存储库中提到 app.run 应该只用于开发,而不是部署或生产。 Link to Tiangolo's comment on this topic他的代码如下:
from flask import Flask
app = Flask(__name__)
from .core import app_setup
if __name__ == "__main__":
# Only for debugging while developing
app.run(host="0.0.0.0", debug=True, port=80)
我的问题是为什么运行 flask app 会出现问题(上述代码的最后一行)并且应该被删除或注释掉。我进行了一系列测试,发现在生产环境中运行或运行 Flask 应用程序时,生成的进程数是相同的。这是我使用 gunicorn 进行的测试的输出。
这是我的 docker-compose。在第 12 行,您可以查看我如何运行 gunicorn。
version: "3.7"
services:
face:
build: ./app
container_name: face
restart: always
expose:
- 660
environment:
- ENDPOINT=/face
- FACE_DETECTION_MODEL=MTCNNTorchFaceDetector
command: gunicorn --workers=2 --threads 1 -b 0.0.0.0:660 entry_point:app --worker-class sync
nginx:
build: ./nginx
container_name: nginx
restart: always
ports:
- 8000:80
depends_on:
- face
使用 app.run 的 flask gunicorn 2 进程:
root@e6c7d9ef03cc:/app# cat entry_point.py
from endpoints import FaceDetection
from base_app import app, api, ENDPOINT
api.add_resource(FaceDetection, ENDPOINT)
if __name__ == '__main__':
app.run("127.0.0.1", port=3000)
root@e6c7d9ef03cc:/app# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gunicorn 1 root 5u IPv4 471109 0t0 TCP *:660 (LISTEN)
gunicorn 7 root 5u IPv4 471109 0t0 TCP *:660 (LISTEN)
gunicorn 8 root 5u IPv4 471109 0t0 TCP *:660 (LISTEN)
root@e6c7d9ef03cc:/app#
正如您在代码中看到的,有 3 个处理器,其中一个是主处理器,另外两个是工作处理器。
没有 app.run 的 flask gunicorn 2 进程(已注释掉):
root@e6c7d9ef03cc:/app# cat entry_point.py
from endpoints import FaceDetection
from base_app import app, api, ENDPOINT
api.add_resource(FaceDetection, ENDPOINT)
# if __name__ == '__main__':
# app.run("127.0.0.1", port=3000)
root@e6c7d9ef03cc:/app# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gunicorn 1 root 5u IPv4 466580 0t0 TCP *:660 (LISTEN)
gunicorn 8 root 5u IPv4 466580 0t0 TCP *:660 (LISTEN)
gunicorn 9 root 5u IPv4 466580 0t0 TCP *:660 (LISTEN)
root@e6c7d9ef03cc:/app#
输出是相同的,丢弃主处理器后,只有 2 个主要工作器启动并运行。
同样的情况也发生在具有 4 个处理器的 gunicorn 应用程序上。
使用 app.run:
root@f1d9f2d3a5d0:/app# cat entry_point.py
from endpoints import FaceDetection
from base_app import app, api, ENDPOINT
api.add_resource(FaceDetection, ENDPOINT)
if __name__ == '__main__':
app.run("127.0.0.1", port=3000)
root@f1d9f2d3a5d0:/app# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gunicorn 1 root 5u IPv4 484435 0t0 TCP *:660 (LISTEN)
gunicorn 7 root 5u IPv4 484435 0t0 TCP *:660 (LISTEN)
gunicorn 8 root 5u IPv4 484435 0t0 TCP *:660 (LISTEN)
gunicorn 9 root 5u IPv4 484435 0t0 TCP *:660 (LISTEN)
gunicorn 10 root 5u IPv4 484435 0t0 TCP *:660 (LISTEN)
root@f1d9f2d3a5d0:/app#
没有应用程序运行:
root@f1d9f2d3a5d0:/app# cat entry_point.py
from endpoints import FaceDetection
from base_app import app, api, ENDPOINT
api.add_resource(FaceDetection, ENDPOINT)
# if __name__ == '__main__':
# app.run("127.0.0.1", port=3000)
root@f1d9f2d3a5d0:/app# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
gunicorn 1 root 5u IPv4 476011 0t0 TCP *:660 (LISTEN)
gunicorn 8 root 5u IPv4 476011 0t0 TCP *:660 (LISTEN)
gunicorn 9 root 5u IPv4 476011 0t0 TCP *:660 (LISTEN)
gunicorn 10 root 5u IPv4 476011 0t0 TCP *:660 (LISTEN)
gunicorn 11 root 5u IPv4 476011 0t0 TCP *:660 (LISTEN)
root@f1d9f2d3a5d0:/app#
重现问题克隆 face-detection-flask-gunicron-docker-compose并运行以下命令:
# get the project
git clone https://github.com/pooya-mohammadi/face-detection-flask-nginx-gunicorn-docker.git
# cd to project's root
cd ace-detection-flask-nginx-gunicorn-docker
# build the images and run the project
sudo docker-compose up --build
# open a new terminal
sudo docker ps -a
# get the container-id for face-detection_face
# open a bash command with that container-id
sudo docker exec -it <container-i> bash # This opens a new command line
# install lsof to view listening services
apt-get install lsof
# view app.run condition
cat entry_point.py | grep app.run # The default is not commented.
lsof -i
将entry_point.py中的app.run注释掉,再次运行进程。
要更改 worker 的数量,请修改 docker-compose.yml 中的第 12 行。
最佳答案
在研究 gunicorn 库一段时间后,我注意到 gunicorn 使用 import.import_module
导入入口点模块(包含应用程序的模块,在我的例子中是 entry_point.py)和if __name__ == '__main__':
下的代码将不会被执行,将任何东西放在那里是非常安全的。 Link to import_app method in gunicorn library .此方法是从方法 load_wsgiapp
中调用的 link to load_wsgiapp在主要运行器类 WSGIApplication
中 Link to WSGIApplication class .
正如我所注意到的,Tiangolo 意味着直接使用 flask 应用程序进行生产是不安全的,因为:
The flask application server is not developed or tested for production performance or security.
关于python - 为什么用 gunicorn 和 uwsgi 运行 flask app.run 有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70588999/
如果我调用一个应用程序两次或多次,但只有一个实例应该运行(这是所需的),我就会遇到一个问题。 首先一些(可能必要的)背景信息: 使用 MAC OS X El Capitan (10.11.6) 我有一
覆盖文件。覆盖 Apps 脚本文件。 这是不是 创建一个新的 Apps 脚本文件的问题。那对我没有帮助。我需要更新 现有的 Apps 脚本文件。这个问题类似于创建一个新文件,但不是同一个问题。更新的语
我是 Apps 脚本的新手,正在尝试了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。需要注意的是:我想在访问脚本的用户而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。
我是 Apps 脚本的新手,正在尝试了解使用另一个帐户在一个帐户中运行/触发脚本的基础知识。需要注意的是:我想在访问脚本的用户而不是拥有脚本的用户的情况下运行脚本——以便将运行时间分配给访问的用户。
我有一个安卓应用程序。我想为我的应用程序实现 App Indexing。 我已经点击了 Google 开发者链接 https://developers.google.com/app-indexing/
有什么区别: import App from '../components/App'; 和 var App = require('../components/App'); 两者都用于获取组件,但它没有
问题: 我有一个使用 requireJS 的简单演示应用程序。当require.min.js脚本加载时,它尝试加载入口点脚本。但是,问题是,而不是 localhost:8090/js/app.js它尝
我正在构建一个 React Native 应用程序,目前正在尝试通过 Firebase Auth 实现一个身份验证注册系统。我已经按照指南/网站上的文档来设置 Firebase 配置文件。我运行该应用
因此 app.yaml 文件的一部分如下所示(至少在 GAE 教程中): handlers: - url: /.* script: main.app 但是,我也看到它看起来像这样: handler
我是Android App开发的新手。当我尝试创建一个新项目Android Project时,弹出以下消息: Information:Gradle tasks [:app:generateDebugS
我正在编写一个应用程序脚本(用于处理电子邮件、任务和日历事件)并希望将其部署为网络应用程序。 该应用程序将在运行它的用户的上下文中运行。该应用程序将被超过 10k+ 的用户使用,甚至可能更多。 在将其
我需要实现一个用于登录网站的 Google Apps 脚本应用,然后如果该网站上的身份验证过程成功,用户应该会在 google 脚本边栏中收到一条消息。 例如:用户输入他的邮箱和密码,然后他点击登录按
我正在开发一个跨平台应用程序,它将在 Google Play 商店和 App Store 上发布。 Google Play 政策以及 App Store 政策规定,您不能使用其他支付系统购买将在应用程
我的 AppEngine 应用程序在我的台式机上的开发服务器上运行良好,但我无法在 Google 服务器上获取版本以关注我的源代码更新。 这是最有说服力的例证。我的 app.yaml 文件开始于: a
我像这样将所有内容重定向到我的 app.yaml 中的单个文件 - url: /.* script: frontcontroller.application 但我仍然必须使用 robots.txt
我想构建一个基于 App Engine 的网络应用程序,并使用 Google 帐户对用户进行身份验证。我需要来自多个域的用户可以登录。从我读到的内容看来,仅使用 Google Accounts API
我无法将我的域指向我使用 Google App Engine 托管的网站。这是背景……注意区分“google apps”(域托管、电子邮件等)和“google app engine”(网站框架)的概念
是否可以通过 App Engine 上内置的 OpenId 实现单点登录?我一直在尝试集成一个 Marketplace 应用程序,并让用户在来自 Google Apps(管理面板或通用导航)时登录。我
有没有办法从 azure-cli 为 Web 应用或函数应用创建和/或激活 App Insights? 现在浏览文档。 最佳答案 我之前也考虑过你的问题。要创建应用程序洞察力,az resource
我在以 Angular 创建新项目时遇到问题。当我运行 ng new myapp 命令时,我得到以下命令 ng 新问候语 Error: Path "/app/app.module.ts" does n
我是一名优秀的程序员,十分优秀!