gpt4 book ai didi

Gunicorn、Flask 和 SQLAlchemy : Concurrent Requests

转载 作者:行者123 更新时间:2023-12-01 01:12:54 25 4
gpt4 key购买 nike

我正在使用 Gunicorn 在 Nginx 上托管 Flask 应用程序 - 它通过 SQLAlchemy 连接到数据库。目前 Gunicorn 配置为总共使用 5 个 worker 。

简而言之,当按下按钮时,应用程序会检查数据库以确保该项目可用,如果可用,则将其提供给用户。

但是,当 Gunicorn 使用 5 个 worker 时,如果两个用户同时按下按钮,他们都会得到该项目。我将 worker 减少到 1,这个问题就消失了。我该如何解决这个问题?

最佳答案

这似乎是一个标准的并发控制问题,而不是 Gunicorn 的问题。

问题可能是您的“检查数据库”是这样实现的:

assign_item(项目 X,用户 U):

  • 检查项目 X 在一个查询中是否可用
  • 将项目 X 分配给用户 U 并返回该值。

  • 假设两个用户(A 和 B)同时尝试声明项目 X,因此assign_item(X, A) 在 Worker #1 上运行,assign_item(X, B) 在 Worker #2 上运行。

    Worker #1 可以运行assign_item(X, A) 的第一行,然后Worker #2 可以运行assign_item(X, B) 的第一行。此时,两个检查都返回 True;该项目可用。所以现在两个工作人员都运行各自的下一个操作,并将相同的项目返回给用户。

    使用数据库解决这个问题的方法是在assign_item中使用BEGIN TRANSACTION和END TRANSACTION,确保这两个操作原子地发生。

    这是一个众所周知的问题,更多信息可以在 http://en.wikipedia.org/wiki/Concurrency_control 中找到。

    关于Gunicorn、Flask 和 SQLAlchemy : Concurrent Requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14203503/

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