python - Flask 应用程序因多个进程而锁定

标签 python python-3.x flask gunicorn

枪兽:19.9.0

flask :1.0.2

Python:3.6.7

我们有一堆内部 API 服务器数据科学模型,每秒有数千个请求。我们最近推出了一个新的进程,无论出于何种原因,当与多个进程一起使用时(Gunicorn 是我们的默认设置),它会处理数百个请求并锁定。

如果我在没有 Gunicorn 的情况下将 API 作为裸文件运行,则以下工作正常:

app.run(ip, port=port, threaded=True)

如果我运行多个进程,它会在启动后不久锁定:

app.run(ip, port=port, threaded=False, processes=2)

如果我将 Gunicorn 与 workers=1 一起使用,它也会锁定,这是配置:

preload_app = False
bind = "0.0.0.0:{}".format(8889)
workers = 1
debug = False
timeout = 120

我已经注释掉了端点中的所有代码,这对其锁定没有影响。感觉像是与依赖项存在某种冲突,但我很难确定它。

如果我尝试在锁定时使用 strace 进行附加,我会在主 Gunicorn 进程上得到一个紧密循环,并显示以下输出:

strace: Process 4387 attached
select(4, [3], [], [], {tv_sec=0, tv_usec=832486}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0

目前有关于去哪里或尝试什么的建议吗?

最佳答案

看来这是由于客户端数量和前面缺少反向代理(例如 nginx)的组合造成的。与客户端数量相比,没有足够的工作人员可以开始排队请求,这使工作人员不堪重负,以至于他们停止响应。我将工作人员数量增加到 60 名,吞吐量更加稳定。

关于python - Flask 应用程序因多个进程而锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55252590/

相关文章:

python - 如何将字典各个键值添加在一起?

mysql.connector.connect 似乎没有通过函数实现持久连接

python - 使用 Flask-SQLAlchemy 选择多对多

python - 我究竟做错了什么?我的代码告诉我猜测是错误的,但它是正确的

python - 将两个列表连接在一起时遇到问题

python - Selenium click() - 选择按钮但不单击

python - Werkzeug 中的线程和本地代理。用法

python - 关于将错误传递给调用者的最佳做法是什么?

python - 永远运行 asyncio 事件循环的 pythonic 方式是什么?

python-3.x - 在threading.thread中,为什么args末尾带逗号