Python 是否可以在单个过程中运行烧瓶?(与ipdb和Docker ttys一起解决明显的问题)

Python 是否可以在单个过程中运行烧瓶?(与ipdb和Docker ttys一起解决明显的问题),python,docker,flask,Python,Docker,Flask,我有一个烧瓶应用程序,我运行的方式如下: 烧瓶运行——主机=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/

我有一个烧瓶应用程序,我运行的方式如下:

烧瓶运行——主机=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
三个过程

如果我使用
——不使用线程运行,我也会使用相同的三个进程:

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应用程序正在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应用程序作为一个进程运行,我将能够连接到docker容器并根据需要使用
ipdb

有没有办法做到这一点

更新:问题清单在启动期间,而不是在请求处理期间 进一步检查后,我发现这个问题只在“启动”代码期间出现。例如:如果断点位于
create\u app
函数内

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

使用
exec
将进程计数从三个减少到两个(根进程被第一个工作进程替换),但问题仍然表现在
create\u app
中的断点上

运行带有
--无重新加载
的烧瓶会使第二个工人离开,因此可以通过不使用或使用
exec
将进程计数强制为一个或两个。使用
--no-reload
运行对于我的用例来说并不理想,但它确实可以解决问题,即使对于
create\u app
中的断点也是如此

就我的目的而言,我可以忍受
ipdb
的限制,只能在请求处理程序中很好地使用终端——我并不认为需要从启动代码运行调试器。(但我仍然会接受一个答案&如果有人能够准确地解释在启动代码断点案例中发生了什么,以及为什么问题没有在请求处理程序断点案例中表现出来,我会很高兴地奖励奖金。)

根据
--no-reload
的发现,它确实感觉到潜在的片状与请求处理过程和代码重新加载过程“共享”的TTY有关

Flask&Docker版本信息
使用flask应用程序可以在单个同步进程上工作

一次只能处理一个请求

如果要处理任何并行请求,请等待它们可以处理,然后使用以下方法:

app.run(host=HOST, port=PORT, threaded=True)

要使烧瓶在单个处理器中运行,请使用以下步骤

if __name__ == '__main__':
    app.run(threaded=False, processes=1)
您是否尝试了“-no debugger”参数?
如果您有调试环境变量,请创建一个调试器进程

flask run --host=0.0.0.0 --without-threads --no-debugger

您是否正在调试模式下运行Flask应用程序?这可能值得一读:@billc,请将
docker version
docker info
docker compose--version
的输出添加到您的问题中。还有什么版本和操作系统?我通过在Mac和Ubuntu上创建一个简单的应用程序进行了测试,但我无法重现这个问题。还将建议在Dockerfile中使用exec flask run--host=0.0.0.0
,并查看它是否有助于修复添加的问题。Gino链接的问题和重复问题中描述的
--无重新加载
模式确实可以解决问题。Tarun关于无法重新编程的报告让我做了更多的测试——这个问题实际上似乎只在应用程序启动时出现,而不是在请求处理时出现。你的目标只是调试代码,或者你这么做还有其他原因吗?
$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01
app.run(host=HOST, port=PORT, threaded=True)
if __name__ == '__main__':
    app.run(threaded=False, processes=1)
flask run --host=0.0.0.0 --without-threads --no-debugger