首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么用app.run和uwsgi运行烧瓶是有问题的?

为什么用app.run和uwsgi运行烧瓶是有问题的?
EN

Stack Overflow用户
提问于 2022-01-05 07:09:56
回答 1查看 644关注 0票数 3

有一个想法表明,不要在生产中运行烧瓶应用程序与古尼角或uwsgi。Tiangolo在他的一个存储库中提到,app.run应该仅用于开发,而不是部署或生产。链接到Tiangolo对此主题的评论的代码如下:

代码语言:javascript
复制
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)

我的问题是,为什么运行烧瓶应用程序会有问题(上述代码的最后一行),应该删除或注释掉。我进行了一系列的测试,发现在生产中使用或使用烧瓶应用程序时,生成的进程数量是相同的。这是我和金牛的测试结果。

这是我的船坞写作。在第12行,你可以检查我是如何运行火鸟的。

代码语言:javascript
复制
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

烧瓶胶2工艺与app.run:

代码语言:javascript
复制
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的烧瓶胶2过程(它被注释掉):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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#

没有app.run:

代码语言:javascript
复制
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#

若要复制该问题,请克隆人脸检测.烧瓶-枪炮-码头-合成并运行以下命令:

代码语言:javascript
复制
# 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  

在app.run中注释entry_point.py并再次运行该进程。

若要更改工人人数,请修改docker-compose.yml中的第12行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-05 13:07:49

在仔细研究了一段时间后,我注意到gunicorn使用import.import_module导入入口点模块(在我的例子中,包含应用程序的模块,entry_point.py),if __name__ == '__main__':下的代码不会执行,在那里放置任何东西都是非常安全的。gunicorn库中的app方法。这个方法是从主运行器类load_wsgiapp wsgiapp中的WSGIApplication 链接到WSGIApplication类调用的。

正如我注意到的,Tiangolo的意思是直接将烧瓶应用用于生产是不安全的,因为:

没有开发或测试烧瓶应用服务器的生产性能或安全性。

贾斯汀·特里普莱特的回答(不和)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70588999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档