gpt4 book ai didi

python - 是否可以在单个进程中运行 flask ? (解决 ipdb 和 Docker ttys 的明显问题)

转载 作者:IT老高 更新时间:2023-10-28 12:46:56 30 4
gpt4 key购买 nike

我有一个 flask 应用程序,我正在像这样运行:

flask 运行 --host=0.0.0.0

当我查看进程列表时,我看到:

UID        PID  PPID  C STIME TTY          TIME CMD
root 1 0 0 23:48 pts/0 00:00:00 /bin/sh -c flask run --host=0.0.0.0
root 6 1 1 23:48 pts/0 00:00:01 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0
root 8 6 3 23:48 pts/0 00:00:02 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0

三个进程。

如果我使用 --without-threads 我也是同样的三个进程:

UID        PID  PPID  C STIME TTY          TIME CMD
root 1 0 0 00:28 pts/0 00:00:00 /bin/sh -c flask run --host=0.0.0.0 --without-threads
root 6 1 2 00:28 pts/0 00:00:02 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0 --without-threads
root 8 6 4 00:28 pts/0 00:00:04 /usr/local/bin/python /usr/local/bin/flask run --host=0.0.0.0 --without-threads

有没有办法以某种方式将 flask 作为单个进程运行?

动机

有问题的 flask 应用程序在 docker 容器中运行。我希望能够使用 ipdb 设置断点。

我观察到,如果我在我的 docker-compose 文件中设置它:

    stdin_open: true
tty: true

并运行一个简单的单进程 python 应用程序,而不是 flask 应用程序...

$ docker exec -it bug_demo_bug_demo_1 bash
root@98245482089b:/opt/bug_demo/bug_demo# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:41 pts/0 00:00:00 /bin/sh -c python app.py
root 7 1 20 00:41 pts/0 00:00:00 python app.py

...并在应用程序处于断点时附加到容器,我可以进入 ibpd 并正常使用它 - 箭头键和选项卡完成正常工作。

但是当我尝试对 flask 应用程序执行相同操作时(在应用程序在断点处等待时附加到容器),事情无法正常工作。

我在 docker-compose.yml 中禁用 tty: true,并且可以使用 ipdb 但没有箭头键和制表符补全,或者我将 tty: true 留在原处,但根本无法真正使用 ipdb,b/c 似乎 tty 已附加到所有三个 flask 进程,导致除单个字符命令之外的所有内容都出现乱码。 (虽然我可以通过此设置看到箭头键和制表符完成工作。)

所有这一切让我相信,如果我能找到一种方法将我的 flask 应用程序作为单个进程运行,我将能够附加到 docker 容器并根据需要使用 ipdb

有没有办法做到这一点?

更新:问题在启动期间出现,而不是在请求处理期间

经过进一步检查,我发现此问题仅在“启动”代码期间出现。例如:如果断点在 create_app 函数内。

如果断点位于请求处理程序方法或从请求处理程序调用的代码中,则一切正常。

使用 exec 将进程数从 3 个减少到 2 个(根进程被第一个 worker 替换),但问题仍然体现在 create_app 内的断点上。

使用 --no-reload 运行 flask 会使第二个 worker 消失,因此进程计数可以被强制为一或两个,然后不使用或使用 exec。使用 --no-reload 运行对于我的用例来说并不理想,但它确实可以解决问题,即使对于 create_app 中的断点也是如此.

出于我的目的,我可以忍受 ipdb 的限制,它只能与请求处理程序中的终端配合使用——我不认为从启动代码运行调试器的需求很大。 (但我仍然会接受答案并愉快地奖励赏金,如果有人能准确解释启动代码断点案例中发生了什么,以及为什么问题没有在请求处理程序断点案例中体现。)

根据 --no-reload 发现,确实感觉底层的脆弱性与请求处理过程和代码重新加载过程“共享”的 TTY 有某种关系。

Flask 和 Docker 版本信息

ipdb> flask.__version__
'1.0.3'
$ docker version
Client: Docker Engine - Community
Version: 18.09.2
API version: 1.39
Go version: go1.10.8
Git commit: 6247962
Built: Sun Feb 10 04:12:39 2019
OS/Arch: darwin/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 18.09.2
API version: 1.39 (minimum version 1.12)
Go version: go1.10.6
Git commit: 6247962
Built: Sun Feb 10 04:13:06 2019
OS/Arch: linux/amd64
Experimental: false
$ docker info
Containers: 22
Running: 3
Paused: 0
Stopped: 19
Images: 362
Server Version: 18.09.2
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 4.9.125-linuxkit
Operating System: Docker for Mac
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.855GiB
Name: linuxkit-025000000001
ID: ZAK2:V2VU:IZFF:6MQQ:IFJB:2ZKY:VHA5:CSO3:VXQQ:UK6C:O3I7:S3ZU
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 59
Goroutines: 89
System Time: 2019-07-28T14:00:38.3184372Z
EventsListeners: 2
HTTP Proxy: gateway.docker.internal:3128
HTTPS Proxy: gateway.docker.internal:3129
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
Product License: Community Engine
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01

最佳答案

要让 flask 在单个处理器中运行,请使用以下代码

if __name__ == '__main__':
app.run(threaded=False, processes=1)

关于python - 是否可以在单个进程中运行 flask ? (解决 ipdb 和 Docker ttys 的明显问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57211937/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com