我正在运行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] 删除。
我来说两句