覆盖类变量和并发的Flask请求

b9s

我正在运行python Flask服务器来执行棘手的算法,其中之一将电缆分配给电子管。

class Tube:
    max_capacity = 5
    cables: List[str]

    def has_capacity(self):
        return len(self.cables) < self.max_capacity

最大容量始终为5,但是现在有一个新客户,实际上其管可以容纳6条电缆。
收到请求后,现在设置Tube.max_capacity = request.args.get('max_capacity', 5)然后,Tube的每个实例将具有正确的设置。

我想知道如果同时处理多个请求,是否可以继续工作?
Flask(我使用Gunicorn作为WSGI)进程是否彼此独立,这样可以安全地进行?我不想遇到奇怪的错误,因为最大容量在一个请求的一半更改,因为另一个请求进来了。

编辑:我尝试了这一点,它似乎按预期工作:

@app.route('/concurrency')
def concurrency():
    my_value = randint(0, 100)
    Concurrency.value = my_value
    time.sleep(8)
    return f"My value: {my_value} should be equal to Concurrency.value {Concurrency.value}"


class Concurrency:
    value = 10

不过,我想知道更多有关多个Flask / Gunicorn请求如何工作的信息。

布鲁诺·德斯胡里尔斯

WSGI应用程序通常使用多个进程(最终在不同的服务器上)进行服务,并且来自同一用户的请求将由第一个可用进程处理。督察:你希望改变在每个请求的任何模块或类级别的变量,这是** *保证下搞砸了一切。

在没有更多上下文的情况下,不可能准确地告诉您如何解决问题,但是在所有情况下,您都必须重新考虑设计。

编辑

流程表现如何?如果其中一个设置了该值,则另一个进程是否也看到该值?

当然不是-每个进程都与其他进程完全隔离-因此更改模块级变量或类属性只会影响当前进程。但是,由于进程并不与客户端绑定(哪个进程将处理给定的请求是完全不可预测的),因此如果下一个请求由另一个进程提供服务,则一个进程中的此类更改不一定会在下一个请求中看到。和:

或者,是否重新使用了流程,然后仍然具有上一个请求的值?

当然可以重用该流程,但这并不意味着同一流程将被同一用户的下一个请求重用-这是问题的第二部分:为其他用户提供服务时,您的流程仍将使用“更新的”max_capacity值来自先前的用户。

IOW,您要做的是保证所有用户的所有内容弄乱这就是为什么我们使用外部(进程外)方法在请求之间存储和共享每个用户的数据的原因-会话(用于易失性数据)或数据库(用于永久性存储)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

Java和/或Spring Boot中的并发异步HTTP请求

来自分类Dev

flask如何处理并发请求?

来自分类Dev

覆盖python中的类变量?

来自分类Dev

Flask在请求之前获取url变量?

来自分类Dev

psycopg2.ThreadConnectionPool,uWSGI和Flask的并发问题

来自分类Dev

静态类和变量

来自分类Dev

避免覆盖超类变量。整形或替代

来自分类Dev

覆盖Symfony请求类-哪里放置覆盖代码?

来自分类Dev

用LESS覆盖CSS类变量

来自分类Dev

用Flask和eventlet响应并发请求

来自分类Dev

可能的OWIN启动和Ninject并发请求问题?

来自分类Dev

使用Rx和SelectMany限制并发请求

来自分类Dev

Flask上下文(应用程序和请求)与线程局部变量

来自分类Dev

是并发请求回购类线程安全的? - 春季启动

来自分类Dev

javascript覆盖类变量

来自分类Dev

并发连接和并发请求有什么区别?

来自分类Dev

PDO类和MYSQL请求

来自分类Dev

Python封装:在类中覆盖变量

来自分类Dev

Java抽象类和覆盖变量

来自分类Dev

如何在Flask中安装请求类?

来自分类Dev

避免覆盖超类变量。整形或替代

来自分类Dev

您只能同时使用setter和getter的计算变量来覆盖超类的存储属性

来自分类Dev

Redux和并发令牌刷新请求

来自分类Dev

如何使用 Rails 和 Heroku 发出多个并行并发请求

来自分类Dev

带有队列和线程的并发请求

来自分类Dev

Flask Python 和 css 变量

来自分类Dev

Flask - 从类中的方法访问请求对象

来自分类Dev

MPI和变量覆盖?

来自分类Dev

类和变量